yPennylane
yPennylane

Reputation: 772

function gsub with multiple columns and data frames R

I have 2 data frames with equal column names. I want to replace a certain expression in 2 columns of multiple data frames. Therefore I wrote the following code:

dat <- data.frame(n = 1:19, des = c("Some very long text", "Some very lang test", "Some vary long text", "Some veri long text", "Another very long text", "Anather very long text", "Another very long text", "Different text", "Diferent text", "More text", "More test", "Much more text", "Muh more text", "Some other long text", "Some otoher long text", "Some more text", "Same more text", "New text", "New texd"), x = c("other text", "bad text", "wrong text", "very bad text", "very nice text","text", "text", "text", "text", "text", "text", "text", "text", "text", "text", "text", "text", "text", "text"))

dat1 <- data.frame(n = 1:5, des = c("very Some long text", "text Some very long", "Some very long text", "long text Some very", "very long Some text"), x = c("crazy text", "very crazy text", "boring text", "very exciting text","ext"))

repla <- function(dat){
vari <- c(which(names(dat) == "x"),which(names(dat) == "des"))
    for (i in vari){
    dat[,i] <<- gsub("very", "0", dat[,i])
    }
}

But why is the repla function not working?

Upvotes: 1

Views: 645

Answers (1)

Tim Biegeleisen
Tim Biegeleisen

Reputation: 522762

Change your function definition to this:

repla <- function(dat){
vari <- c(which(names(dat) == "x"),which(names(dat) == "des"))
    for (i in vari) {
        # don't use the parent scope assignment operator here
        # instead, just modify the local variable
        dat[,i] <- gsub("very", "0", dat[,i])
    }

    # return modified data frame to the caller
    return(dat)
}

And then use it like this:

dat1 <- repla(dat1)

Here is the output of dat1 after using this code:

> dat1
  n              des               x
1 1 0 Some long text      crazy text
2 2 text Some 0 long    0 crazy text
3 3 Some 0 long text     boring text
4 4 long text Some 0 0 exciting text
5 5 0 long Some text             ext

Upvotes: 1

Related Questions