Search code examples
rdplyrrecode

R recode multiple variables following same rules


data=data.frame("x1"=c(1:10),
                "x2"=c(1:4,4,6:10),
                "x3"=c(1:3,2:5,5:7),
                "x4"=c(21:30),
                "x5"=c(35:44))

recode=c("x1","x2","x3")


data <- data[recode %in% c(4,5)] <- NA

I want to store a specific set of variables for example above I store x1,x2,x3 in 'recode'. Then I want to change all the values for all variables in recode such that any value of 4 or 5 is set to NA.


Solution

  • We need to use replace with lapply

    data[recode] <- lapply(data[recode], function(x) replace(x, x %in% 4:5, NA))
    data
    #   x1 x2 x3 x4 x5
    #1   1  1  1 21 35
    #2   2  2  2 22 36
    #3   3  3  3 23 37
    #4  NA NA  2 24 38
    #5  NA NA  3 25 39
    #6   6  6 NA 26 40
    #7   7  7 NA 27 41
    #8   8  8 NA 28 42
    #9   9  9  6 29 43
    #10 10 10  7 30 44
    

    Or with dplyr

    library(dplyr)
    data %>%
       mutate_at(vars(recode), ~ na_if(., 4)) %>%
       mutate_at(vars(recode), ~ na_if(., 5))
    #   x1 x2 x3 x4 x5
    #1   1  1  1 21 35
    #2   2  2  2 22 36
    #3   3  3  3 23 37
    #4  NA NA  2 24 38
    #5  NA NA  3 25 39
    #6   6  6 NA 26 40
    #7   7  7 NA 27 41
    #8   8  8 NA 28 42
    #9   9  9  6 29 43
    #10 10 10  7 30 44