2017-05-02 116 views
0

我有我的数据集的一些因素变量,我尝试将它们转换为数字与循环循环因素转换为数字

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

你想干什么'的(我在1:2)'(或可替代'的(我在seq_along (df [,1:2]))''而不是'for(i in df [,1:2])' –

+1

对于您的示例数据,只需'df $ a < - as.numeric(df $ a)'和'df $ b < - as.numeric(df $ b)'将会起作用 – neilfws

回答

2

与往常一样,R内置了做这样的映射没有问题的功能:

df[] <- lapply(df, function(x) c(a=1,b=2)[as.character(x)]) 
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" 
+0

这是一个很好的解决方案,但我们再次得到因子变量,在真实数据集中我有40个变量))) – Edward

1

只需指出:数据框是一个列表,并且lapply通常是一个很好的解决方案,用于列表。 ;)例如,您可以尝试:

df[] <- lapply(df, function(x){ 
    if(is.factor(x)) return(revalue(x, c('a' = 1, 'b'= 2))) 
    else return(x) 
} ) 

此代码执行以下操作:对于每列,它检查列是否为因子。如果它是一个因素,它会根据您的情况重新编码。如果它不是一个因素,它将保持数据不变。您还可以更改提供给lapply的功能,以执行更“精细”的操作。

+1

啊,所以它是... – Gregor