[英]How to recode a set of variables in a dataframe in R
我有一个数据框,其中的变量包含从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)
不需要外部函数或软件包。 只需在lapply
使用匿名函数,如下所示:
df[recode.list] <- lapply(df[recode.list], function(x) 6-x)
使用[]
可让我们直接替换原始数据集中的那些列。 这是必需的,因为仅使用lapply
会导致数据作为命名list
。
如评论中所述,您实际上甚lapply
可以跳过lapply
:
df[recode.list] <- 6 - df[recode.list]
这是使用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
#...
您可以使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.