在R中将所有列从因子转换为数字

4

我正在处理一个大数据集,因为数据集中的某些列被视为因子而引起了一些问题。如何将所有列从因子转换为数字,而不必逐列进行?

我尝试应用一个小循环,但它返回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

有没有一些命令可以将所有这些列转换为数字类型?

1
你的循环不起作用是因为在结尾处你使用了 data[i] 而不是 data[,i] - ping
或者使用“[[”,它将返回因子向量而不是列表中的因子。 - IRTFM
4个回答

17

这个可以运行,但我认为你的数据中有奇怪的字符或空格,会导致它被读入为因子。你可以尝试使用参数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

1
请注意,如果您希望输出为数据框而不是列表,请执行 do.call(cbind, data)(或 rbind,具体取决于您的数据结构)。 - ale19
@ale19 我的回复确实会给出一个 data.frame... 试试实际代码并查看。 - Tyler Rinker
1
@TylerRinker 不,它给了一个列表。我可以独立验证它。 - ABCD
@SmallChess,你能够对你的数据进行 str 操作并验证你最初是否有一个 data.frame,并且每列的类型是什么吗?它应该返回一个 data.frame。 - Tyler Rinker
我在我的数据上运行了str(df)。确认它是data.frame。运行上面的lapply(...)将其转换为列表。@ale19和SmallChess是正确的。然而,ale19的建议对我不起作用(也许我实现有误)。 - Bradford
使用as.data.frame()函数处理lapply()的输出可以解决这个问题,我认为。@SmallChess - Bradford

5
你可能尝试解决了错误的问题,或在错误的地方解决问题。通常情况下,你认为是数字的列被识别为因子,是因为原始数据中数字位置有字符。将这些字符转换为数字会导致缺失值而不是预期的数字(这比错误的数字更好)。最好修复源数据,以便正确读取。
下一步选择是使用colClasses参数来指定应将列设置为数字并进行自动转换。这甚至可以用于转换带有"$"、"%"或","的“数字”。
如果以上方法对你不起作用,且想要转换现有的数据框,则可以采用以下方法:
w <- which( sapply( mydf, class ) == 'factor' )
mydf[w] <- lapply( mydf[w], function(x) as.numeric(as.character(x)) )

2

我通过简单地写入数据框并指定所有列为数值类型,然后再读取它来实现这一点。我使用data.table包,但基本的读/写函数也适用。

library(data.table)
fwrite(dfm,"some.name.temp")
dfm <- fread("some.name.temp",colClasses="numeric")

1

#VALUE! 似乎是奇怪的字符;如果是这样,使用 na.string 参数告诉 R 将其视为缺失值可能是解决问题的方法。

read.table(..., na.string="#VALUE!")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接