循环将因子转换为数字

时间:2017-05-02 21:56:01

标签: r loops dplyr

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

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

4 个答案:

答案 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)]))