在R中将所有列从因子更改为数字

时间:2014-05-28 14:58:19

标签: r class dataset multiple-columns

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

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

是否有一些命令可以应用于将所有这些列转换为数字类?

4 个答案:

答案 0 :(得分:10)

这有效,但我认为你的数据有一个奇怪的字符或空格,这使得它作为因素被读入。您可以尝试使用参数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 :(得分:4)

您可能正在尝试解决错误的问题,或者在错误的地方解决问题。通常,您认为数字的列被读入的因素是因为存在数字应该在原始数据中的字符。将这些转换为数字将导致缺少值而不是预期的数字(这比错误的数字更好)。最好修复数据的原始来源,以便正确读取数据。

下一个选项是使用colClasses read.table参数和相关函数来指定列应为数字,转换将自动进行。甚至可以使用它(通过几个步骤)将“数字”与“$”,“%”或“,”转换为某个地方。

如果这些不适合您并且您想要转换现有数据框,那么这是一种方法:

w <- which( sapply( mydf, class ) == 'factor' )
mydf[w] <- lapply( mydf[w], function(x) as.numeric(as.character(x)) )

答案 2 :(得分:1)

#VALUE!似乎是奇怪的角色;如果是这样,告诉R使用na.string参数将其视为缺失可能是要走的路。

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

答案 3 :(得分:1)

我通过简单地编写数据框并将其读回来完成此操作,指定所有列都是数字。我使用data.table包,但它也适用于基本的读/写函数。

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