2011-05-25 64 views
23

我有一系列CSV文件,其中数字使用逗号而不是小数点格式化为欧式样式,即0,5而不是0.5如何用逗号作为小数点分隔符来读取数字?

在导入到R之前,有太多的这些文件需要编辑它们。我希望read.csv()函数有一个简单的参数,或者一个方法应用于提取的数据集,以便R将数据视为一个数字而不是一个字符串。

+0

您应该提供一个虚拟数据。如果你的分隔符也是'',这可能会更复杂的问题。 =/ – aL3xa 2011-05-25 11:06:41

+4

也许你可以尝试'read.csv2'? – Marek 2011-05-25 11:09:14

+0

@Marek,没错,如果分隔符是';',但可以很容易地设置另一个分隔符字符串... – aL3xa 2011-05-25 11:11:42

回答

37

当您检查?read.table时,您可能会找到所需的所有答案。

有两个问题与(大陆)欧洲CSV文件:

  1. 是什么在CSV的c代表什么?对于标准的CSV,这是一个,,欧洲CSV这是一个;
    sepread.table
  2. 什么是小数点的字符对应的参数?对于标准的CSV,这是一个.,欧洲CSV这是一个,
    decread.table

相应的参数来读取标准CSV使用read.csv,阅读欧洲CSV使用read.csv2。这两个函数只是设置适当参数的read.table的包装。

如果您的文件不符合这些标准之一,请手动设置参数。

+2

没有这样的事情,“欧洲csv ”。你可能会提到德国/法国,......号码表示。但是,没有单个/简单的欧洲csv :) – xhudik 2016-07-13 10:50:21

+0

您可以指导如何阅读逗号充当小数点分隔符和行为分隔符的行吗?字段值由双引号分隔。我提出这个问题[这里](https://stackoverflow.com/questions/44855415/r-how-to-read-in-numbers-with-comma-as-a-dec-separator-a-field-separator-日)。 – hhh 2017-06-30 22:07:38

1

也许

as.is=T 

这也防止了对字符列转换为因素

10

?read.table

dec  the character used in the file for decimal points. 

是的,你可以利用它来进行read.csv为好。 (对我说:没有愚蠢的,你不能!)

另外,您还可以使用

read.csv2 

其中假定“”小数点分隔符和‘;’列分隔符。

+2

谢谢! '结果< - read.csv2(file =“results.csv”,head = TRUE,sep =“;”,dec =“,”)'为我做了这项工作:) – Johan 2014-01-06 19:56:29

3
read.csv(... , sep=";") 

假设该进口领域被称为“量”,就可以解决这样的类型,如果正在读你的号码为字符:

d$amount <- sub(",",".",d$amount) 
d$amount <- as.numeric(d$amount) 

我有这样的事发生在我经常沿着当从excel或excel csv导入时遇到一些其他的小烦恼。由于看起来没有一致的方法来确保在导入到R时获得期望的结果,所以事后修复似乎是最好的方法。我的意思是,看看你输入的内容 - 确保它是你的预期,如果不是这样的话就修复它。

+0

我喜欢用'setAs'解决方案,就像从[DWin](http://stackoverflow.com/questions/5068705/processing-negative-number-in-accounting-forma-in-r/5069649#5069649)和[ Greg Snow](http://stackoverflow.com/questions/1523126/how-to-read-a-csv-file-in-r-where-some-numbers-contain-commas/3611619#3611619) – Marek 2011-05-25 12:38:43

1

可以用作如下:

MYDATA < - 函数read.table(FILEIN,DEC = “”)

输入文件(FILEIN):

d:\ TEST>更多输入2 .TXT

2014年6月5日9点19分38秒0 3,182534

2014年6月5日九时19分51秒0 4,2311

0

如果您指出缺失值的表示方式(na.strings = ...),也可能解决问题。例如V1和V2在这里有相同的格式(小数在csv文件“”隔开),但由于来港存在于V1它被解释为因素:

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 
0

只需添加到布兰登的回答以上,这工作很适合我(我没有足够的代表评论):

如果您使用

d$amount <- sub(",",".",d$amount) 
    d$amount <- as.numeric(d$amount) 

不要忘记,你可能需要sub("[.]", "", d$amount, perl=T)以绕过.字符。

相关问题