如何在R中的数据框中重新编码一组变量

时间:2014-11-20 13:37:24

标签: r reverse lapply recode

我有一个数据框,其中包含从1到5的不同变量。我想以5变为1的方式重新编码一些变量,反之亦然(x = 6-x)。 我想定义一个变量列表,它将在我的数据帧中像这样重新编码。

以下是使用lapply的方法。我还没有真正理解它。

  #generate example-dataset
    var1<-sample(1:5,100,rep=TRUE)
    var2<-sample(1:5,100,rep=TRUE)
    var3<-sample(1:5,100,rep=TRUE)
    dat<-as.data.frame(cbind(var1,var2,var3))

    recode.list<-c("var1","var3")  
    recode.function<- function(x){          
    x=6-x
     }
    lapply(recode.list,recode.function,data=dat)

3 个答案:

答案 0 :(得分:6)

不需要外部功能或包装。只需在lapply中使用匿名函数,就像这样:

df[recode.list] <- lapply(df[recode.list], function(x) 6-x)

使用[]可让我们直接在原始数据集中替换这些列。这是必需的,因为仅使用lapply会导致数据成为名为list的数据。


如评论中所述,您甚至可以跳过lapply

df[recode.list] <- 6 - df[recode.list] 

答案 1 :(得分:1)

以下是使用dplyr执行此操作的选项:

recode.function<- function(x){          
  x <- 6-x 
}

recode.list <- c("var1","var3") 

require(dplyr)
df %>% mutate_each_(funs(recode.function), recode.list)

#    var1 var2 var3
#1      2    2    4
#2      3    3    3
#3      3    5    2
#4      3    3    2
#5      4    3    3
#6      5    4    1
#...

答案 2 :(得分:1)

您可以使用mapvalues中的plyr

require(plyr)
# if you just want to replace 5 with 1 and vice versa
df[, recode.list] <- sapply(df[, recode.list], mapvalues, c(1, 5), c(5,1))
# if you want to apply to x=6-x to all values (in this case you don't need mapvalues)
df[, recode.list] <- sapply(df[, recode.list], mapvalues, 1:5, 5:1)