我有一系列 CSV 文件,其中数字采用欧洲风格格式,使用逗号而不是小数点,即
0,5
而不是 0.5
。
这些文件太多,无法在导入到 R 之前对其进行编辑。我希望
read.csv()
函数有一个简单的参数,或者一种应用于提取的数据集的方法,以便 R 将数据视为数字而不是字符串。
当您检查
?read.table
时,您可能会找到您需要的所有答案。
(大陆)欧洲 csv 文件存在两个问题:
c
代表什么?对于标准 csv,这是一个 ,
,对于欧洲 csv,这是一个 ;
sep
是 read.table
.
,对于欧洲 csv,这是一个 ,
dec
是 read.table
要读取标准 csv,请使用
read.csv
,要读取欧洲 csv,请使用 read.csv2
。这两个函数只是 read.table
的包装,用于设置适当的参数。
如果您的文件不遵循这些标准中的任何一个,请手动设置参数。
来自
?read.table
:
dec the character used in the file for decimal points.
是的,您也可以将其用于
read.csv
。 (对我来说:不傻,你不能!)
或者,您也可以使用
read.csv2
假设有一个“,”小数分隔符和一个“;”用于列分隔符。
read.csv(... , sep=";")
假设这个导入的字段名为“金额”,如果您的数字被作为字符读取,您可以通过这种方式修复类型:
d$amount <- sub(",",".",d$amount)
d$amount <- as.numeric(d$amount)
从 excel 或 excel csv 导入时,我经常遇到这种情况以及其他一些小烦恼。由于似乎没有一致的方法来确保在导入 R 时获得您所期望的结果,因此事后修复似乎是最好的方法。我的意思是,查看您导入的内容 - 确保它是您所期望的,如果不是,请修复它。
可以使用如下:
mydata <- read.table(fileIn, dec=",")
input file (fileIn):
D:\TEST>more input2.txt
06-05-2014 09:19:38 3,182534 0
06-05-2014 09:19:51 4,2311 0
如果您指出缺失值的表示方式(na.strings=...),问题也可能得到解决。例如,这里的 V1 和 V2 具有相同的格式(在 csv 文件中小数点用“,”分隔),但由于 V1 中存在 NA,因此它被解释为因子:
dat <- read.csv2("...csv", header=TRUE)
head(dat)
> ID x time V1 V2
> 1 1 0:01:00 0,237 0.621
> 2 1 0:02:00 0,242 0.675
> 3 1 0:03:00 0,232 0.398
dat <- read.csv2("...csv", header=TRUE, na.strings="---")
head(dat)
> ID x time V1 V2
> 1 1 0:01:00 0.237 0.621
> 2 1 0:02:00 0.242 0.675
> 3 1 0:03:00 0.232 0.398
也许
as.is=T
这也阻止了将字符列转换为因子
您可以将小数字符作为参数传递(
dec = ","
):
# Semicolon as separator and comma as decimal point by default
read.csv2(file, header = TRUE, sep = ";", quote = "\"", dec = ",",
fill = TRUE, comment.char = "", encoding = "unknown", ...)
只是补充一下布兰登上面的答案,这对我来说效果很好(我没有足够的代表来发表评论):
如果您正在使用
d$amount <- sub(",",".",d$amount)
d$amount <- as.numeric(d$amount)
不要忘记,您可能需要
sub("[.]", "", d$amount, perl=T)
来绕过 .
角色。