将R中的所有列从因子更改为数字
Posted
技术标签:
【中文标题】将R中的所有列从因子更改为数字【英文标题】:Change all columns from factor to numeric in R 【发布时间】:2014-07-17 21:12:56 【问题描述】:我正在处理一个导致一些问题的大型数据集,因为数据集中的某些列被视为因素。如何将所有列从因子转换为数字,而不必逐列执行?
我尝试应用一个小循环,但它返回 NA 值。以下是适用于该案例的示例数据:
data <- structure(list(v1 = c(22.394, 43.72, 58.544, 56.877, 1.659, 29.142,
67.836, 68.851), v2 = c(144.373, 72.3, 119.418, 112.429, 35.779,
41.661, 166.941, 126.548), v3 = structure(c(33L, 29L, 33L, 5L,
13L, 31L, 5L, 8L), .Label = c("", "#VALUE!", "0", "1", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20",
"21", "22", "23", "24", "25", "26", "28", "29", "3", "30", "32",
"33", "4", "48", "5", "6", "7", "8", "9"), class = "factor"),
v4 = structure(c(24L, 6L, 22L, 23L, 16L, 22L, 23L, 26L), .Label = c("",
"-1", "-2", "-4", "#VALUE!", "0", "1", "10", "11", "12",
"13", "14", "15", "16", "17", "18", "19", "2", "24", "28",
"29", "3", "4", "5", "6", "7", "8", "9"), class = "factor")), .Names = c("v1",
"v2", "v3", "v4"), row.names = c("4", "5", "6", "7", "8", "9",
"10", "11"), class = "data.frame")
for (i in 1:ncol(data))
data[,i] <- as.numeric(as.character(data[i]))
## returns NAs
我可以应用一些命令将所有这些列转换为数字类吗?
【问题讨论】:
你的循环不起作用,因为你有data[i]
而不是data[,i]
。
或者使用“[[”,这将返回rhw因子向量而不是列表中的因子。
【参考方案1】:
这可行,但我认为您的数据有一个奇怪的字符或空格,这使它成为读取的因素。您可以尝试使用参数stringsAsFactors = FALSE
阅读。但仍然无法解决字符与数字读入的问题。这是一个修复:
data[] <- lapply(data, function(x) as.numeric(as.character(x)))
## > str(data)
## 'data.frame': 8 obs. of 4 variables:
## $ v1: num 22.39 43.72 58.54 56.88 1.66 ...
## $ v2: num 144.4 72.3 119.4 112.4 35.8 ...
## $ v3: num 7 4 7 10 18 5 10 13
## $ v4: num 5 0 3 4 18 3 4 7
【讨论】:
请注意,如果您希望输出是数据框而不是列表,只需执行do.call(cbind, data)
(或rbind
,具体取决于您的数据结构)
@ale19 我的回复确实给出了一个 data.frame...尝试实际代码并查看
@TylerRinker 不,它给出了一个列表。我可以独立验证。
@SmallChess 您能否对玩具数据进行分析并验证您是否有一个 data.frame 开头以及每列的类型是什么。它应该返回一个 data.frame。
我在我的数据上运行了 str(df)。确认是data.frame。运行上面的 lapply(...) 将其转换为列表。 @ale19 和 SmallChess 是正确的。但是,ale19 的建议对我不起作用(也许我执行不正确)。【参考方案2】:
您可能试图解决错误的问题,或者在错误的地方解决问题。通常,将您认为是数字的列作为一个因素读入的原因是因为在原始数据中存在数字应该包含的字符。将这些转换为数字将导致缺失值而不是预期的数字(这比错误的数字要好)。最好修复数据的原始来源,以便正确读入。
下一个选项是使用 read.table
的 colClasses
参数和相关函数来指定列应该是数字并且将自动进行转换。这甚至可以用于(通过更多步骤)将“数字”与“$”、“%”或“,”在它们的某处转换。
如果这些对您不起作用并且您想转换现有数据框,那么这是一种方法:
w <- which( sapply( mydf, class ) == 'factor' )
mydf[w] <- lapply( mydf[w], function(x) as.numeric(as.character(x)) )
【讨论】:
【参考方案3】:我通过简单地写入数据框并将其读回指定所有列都是数字来实现这一点。我使用 data.table 包,但它也适用于基本的读/写功能。
library(data.table)
fwrite(dfm,"some.name.temp")
dfm <- fread("some.name.temp",colClasses="numeric")
【讨论】:
【参考方案4】:#VALUE!
似乎是个奇怪的字符;如果是这样,使用 na.string
参数告诉 R 这应该被视为缺失可能是要走的路。
read.table(..., na.string="#VALUE!")
【讨论】:
以上是关于将R中的所有列从因子更改为数字的主要内容,如果未能解决你的问题,请参考以下文章
bind_rows_(x, .id) 中的错误:无法将列从因子转换为数字