【问题标题】:convert factor and character to numeric in a dataframe在数据框中将因子和字符转换为数字
【发布时间】:2016-02-24 19:18:47
【问题描述】:

我有一个要过滤的数据框。这是结构:

'dataframe': 45 obs. of 1450 variables:
$ X01493112  :Factor w/ 47 levels "01493112", "0145769",...
..- attr(*, "names")= chr "510130020" "510360002"

我感觉我无法过滤它,因为我有因子和字符,但我无法将其转换为数字。我试过了:

as.numeric.factor <- function(x) {as.numeric(levels(x))[x]}
df2 <- as.numeric.factor(df1)

还有许多其他转换,但我不知道为什么它不起作用,当我调用新的 df 时,我得到了

>numeric(0)

【问题讨论】:

  • 您是否对过滤器使用算术条件?提前添加更多关于过滤的信息会有所帮助。
  • 这看起来不像数据框的标准str()'dataframe' 应该是'data.frame')。 class(df1) 是什么?
  • 如果可能,请使用read.whatever(..., stringsAsFactors = FALSE)

标签: r dataframe type-conversion


【解决方案1】:

使用一些示例数据会有所帮助,但请尝试:

df$your_factor_variable_now_numeric <- 
                as.numeric(as.character(df$your_old_factor_variable))

并且仅使用它来转换因子变量,而不是完整的数据框。你也可以看看type.convert。如果你想转换数据框中的所有因素,你可以使用类似的东西

 df[] <- lapply(df, function(x) as.numeric(as.character(x)))

请注意,这会转换所有因子,如果您有不代表数值的因子,则可能不是您想要的。如果不必要的转换是一个问题,或者如果数据中有非数字因素或字符,则以下是合适的:

 numerify <- function(x) if(is.factor(x)) as.numeric(as.character(x)) else x
 df[] <- lapply(df, numerify)

不过,在更一般的一点上,变量的类型不应阻止您进行过滤,如果通过过滤,您的意思是对数据框进行子集化。但是,类型转换应该用上面的代码来解决。

【讨论】:

  • lapply 不仅会转换所有因子列,还会转换数据集中的所有列
  • 只使用一个索引,例如idx &lt;- sapply(df, is.factor); df[idx] &lt;- lapply(df[idx], ...)
  • 我同意。但是,在这种情况下,我们谈论的是 1450 列的 45 个观察值。这种低效率不太可能引起注意。
  • 这仍然是不好的做法。此外,您忽略了一个非常重要的问题。看看字符向量(列)会发生什么:as.numeric(as.character(letters))
  • 好的,我调整了我的解决方案以反映您的优点。感谢 cmets。
【解决方案2】:
fun1 <- function(x) as.numeric(as.character(x))
fun2 <- function(x) as.numeric(x)

fac_to_num <- function(y) modifyList(y,lapply(y[sapply(y,is.factor)],fun1))

char_to_num <- function(y) modifyList(y,lapply(y[sapply(y,is.factor)],fun2))

fac_to_num 应用于数据中的列以进行因子-> 数字转换,char_to_num 用于字符到数字的转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2020-10-05
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多