我正在将一个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 ...
我该如何纠正?
答案 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)等基本检查将显示数据实际是什么。