我的数据集中有一些因子变量,我尝试将它们转换为带循环的数字
a = sample(c('a', 'b'), 100, replace = TRUE)
b = sample(c('a', 'b'), 100, replace = TRUE)
df = as.data.frame(cbind(a, b))
library(plyr); library(dplyr)
for(i in df[, 1:2]) {
k = as.numeric(as.character(revalue(df[,i],
c('a' = 1,
'b'= 2
))))
}
我得到错误
Error in revalue(df[, i], c(a = "1", b = "2")) :
x is not a factor or a character vector.
怎么了? NB重要的是'a'等于1& 'b'= 2
答案 0 :(得分:2)
与往常一样,R具有内置功能,可以做到这种映射没有问题:
df[] <- lapply(df, function(x) c(a=1,b=2)[as.character(x)] )
答案 1 :(得分:1)
你不需要循环,例如:
library(plyr)
as.data.frame(sapply(df, mapvalues,from = c("a", "b"),to = c(1, 2)))
和
df2$a <- as.numeric(as.character(df2$a))
df2$b <- as.numeric(as.character(df2$b))
class(df2$a)
[1] "numeric"
答案 2 :(得分:1)
只是指出这一点:数据框是一个列表,lapply
通常是一个很好的解决方案来做列表的东西。 ;)例如,您可以尝试:
df[] <- lapply(df, function(x){
if(is.factor(x)) return(revalue(x, c('a' = 1, 'b'= 2)))
else return(x)
} )
此代码执行以下操作:对于每列,它会检查列是否为因子。如果它是一个因素,它会根据您的情况进行重新编码。如果它不是一个因素,它将保持数据不变。您还可以更改提供给lapply
的功能,以执行更多“精心设计”的操作。
答案 3 :(得分:0)
首先我们编写函数
form =function(x) as.numeric(revalue(x, c('a'= 1, 'b'=2)))
df[, c(1,2)] = as.data.frame(Map(form, df[, c(1,2)]))