【问题标题】:Loop to convert factors to numeric循环将因子转换为数字
【发布时间】:2017-09-30 13:36:51
【问题描述】:

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

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.

怎么了? 注意 'a' 等于 1 & 'b' = 2 很重要

【问题讨论】:

  • 你想做for(i in 1:2)(或者for(i in seq_along(df[, 1:2]))而不是for(i in df[, 1:2])
  • 对于您的示例数据,只需 df$a <- as.numeric(df$a)df$b <- as.numeric(df$b) 即可。

标签: r loops dplyr


【解决方案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"

【讨论】:

  • 这是一个很好的解决方案,但我们又得到了因子变量。在真实数据集中,我有 40 个变量)))
【解决方案2】:

只是指出这一点:数据框是一个列表,lapply 通常是对列表进行处理的好方法。 ;) 例如,您可以尝试:

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

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

【讨论】:

    【解决方案3】:

    与往常一样,R 内置了执行这种映射的功能:

    df[] <- lapply(df, function(x) c(a=1,b=2)[as.character(x)] )
    

    【讨论】:

      【解决方案4】:

      首先我们编写函数

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多