Math.data.frame中的错误.......数据框中的非数字变量:

时间:2011-08-06 00:36:25

标签: r

我正在将一个csv文件读入R并尝试记录数据。 csv文件包含数据列,第一行包含文本标题和其余数字数据。

data<-read.csv("rawdata.csv",header=T)
trans<-log(csv2)

执行此操作时出现以下错误:

  

Math.data.frame中的错误(列表(收入= c(18766L,20197L,20777L,   23410L,:数据框中的非数字变量:成本

str 的输出应已插入Q-body:

data.frame': 167 obs. of 3 variables: 
 $ X: int 18766 20197 20777 23410 23434 22100 22337 21511 22683 23151 ... 
 $ Y: Factor w/ 163 levels "1,452.70","1,469.00",..: 22 9 55 109 158 82 131 112 119 137 ...
 $ Z: num 564 608 636 790 843 ...

我该如何纠正?

4 个答案:

答案 0 :(得分:2)

编辑:删除了有关结构的猜测,因为它现在已经提供。

数据框是列表,因此lapply将遍历它们的列并返回对它们完成的数学函数。

如果列是一个因素(这里str(Costs)会告诉你)那么你可以做一个可能效率低下的方法来转换所有列,就像它们是因素一样:

Costs_logged <- lapply(Costs, function(x) log(as.numeric(as.character(x))) )
Costs_logged

(请参阅有关因子转换为数字的常见问题解答。)

EDIT2:如果要在标签中使用逗号转换因子变量,请使用以下方法:

data$Y <- as. numeric( gsub("\\,", "", as.character(data$Y)  ) )

这个版本的早期版本只有一个反斜杠,但由于正则表达式和R都使用反斜杠作为转义字符,因此需要双重转义“特殊正则表达式字符”(参见?regex for listing)。

答案 1 :(得分:2)

多田! Y是一个因素 - 一个大问题。逗号不应该在那里。

此外,您的原始问题有一些异常:data是已加载的data.frame,但转换已应用于csv2。你重命名了这些列吗?如果是这样,您没有完整地概述所涉及的步骤。无论如何,问题是你的第二栏中有逗号。

答案 2 :(得分:1)

您能否使用给您带来麻烦的变量的前几个值?如果“Costs”变量给你带来麻烦(从你的例子看起来是什么样的),执行类似这样的事情:

data <- read.csv("rawdata.csv",header=T)
data[c(1:5),"Costs"]

听起来好像你在csv文件中有一列值 - 列Y--在数字中有逗号。也就是说,听起来你的csv文件看起来像这样:

X,Y,Z
"18766","1,452.70","564"
"20197","1,469.00","608"

或     X,Y,Z     18766, “1,452.70”,564     20197, “1,469.00”,608

或类似的东西。如果是这种情况,问题是R中的逗号不能轻易读取Y列(即使它使我们人类更容易阅读)。你需要摆脱那些逗号;也就是说,使您的数据文件看起来像这样:

X,Y,Z
18766,1452.70,564
20197,1469.00,608

(你可以留下引号 - 只需删除数字中的逗号)。

有很多方法可以做到这一点。如果从excel导出数据,请以不同方式格式化该列。或者,或者,在excel中打开csv,将其保存为制表符分隔文件,在您喜欢的文本编辑器中打开文件,然后查找并删除逗号(“查找并替换为空”)。

然后尝试使用原始命令将其拉回到R中。

答案 3 :(得分:0)

显然,列不是全数字,所以只需确保它们是。您可以通过在读入时强制每列的类来执行此操作:

data&lt; - read.csv(“rawdata.csv”,colClasses =“numeric”)

(read.csv只是read.table的包装器,默认情况下header = TRUE)

如果事实上可行,那将确保所有列都是类numeric

如果它们确实不是数字列,请排除您不想转换的列,或者只是单独处理列:

x <- data.frame(x = 1:10, y = runif(1, 2, 10), z = letters[1:10])

colClasses可以通过指定“NULL”来忽略列,如果这样可以使事情变得更简单。

这些是等价的,因为“x”和“y”是前两列:

log(x[ , 1:2])


log(x[ , c("x", "y")])

单独:

log(x$x)

log(x$y)

检查从外部源读取的数据的假设始终很重要。 summary(x),head(x)和str(x)等基本检查将显示数据实际是什么。