R:使用不同的小数分隔符

时间:2017-06-20 15:23:13

标签: r numeric fread separator

通过fread读取csv文件并使用colClasses将列作为数字读取时,我遇到的数据包含逗号而不是点数。由于数据文件的来源不同,有些人使用"。"和一些使用","作为小数点分隔符

dt <- data.table(a=c("1,4","2,0","4,5","3,5","6,9"),c=(10:14))
write.csv(dt,"dt.csv",row.names=F)
dcsv <- fread("dt.csv", colClasses = list(numeric = 1:2), dec = ",").

我有两个问题: 我想把两个列都读成数字。所以我尝试使用dec = ","。我现在得到error: Column number 2 (colClasses[[1]][2]) is out of range [1,ncol=1] 所以我改为colClasses = list(numeric = 1),但不太明白这一点。

第一列仍然是字符类型而不是数字。

我怎样才能将dec更改为.,,因为我事先并不知道数百个文件中使用的十进制分隔符的类型。我尝试了一个矢量,但没有成功。我错过了什么?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

拥有包含2种不同类型数字分隔符的文件是不正常的。

你应该首先询问文件的来源。

尽管如此,如果您有这样的文件,正确的读取方法是使用逗号分隔符作为字符串的变量然后将其转换为数字。

library(data.table)

dt <- data.table(a=c("1,4","2,0","4,5","3,5","6,9"),c=(10:14))
write.csv(dt,"dt.csv",row.names=F)
dcsv <- fread("dt.csv", dec = ".")
dcsv[, a:= as.numeric(gsub("\"", "", gsub(",", ".", a)))]

如果您不知道您的变量是使用逗号还是点分隔符,则可以循环变量以测试变量是否只是一个只包含数字和逗号的字符串,并仅转换满足该条件的变量。 / p>