【问题标题】:How to read in numbers with a comma as decimal separator?如何以逗号作为小数分隔符读取数字?
【发布时间】:2011-09-01 16:13:56
【问题描述】:

我有一系列 CSV 文件,其中数字使用逗号而不是小数点以欧洲风格格式化,即 0,5 而不是 0.5。

在导入到 R 之前,这些文件太多,无法对其进行编辑。我希望read.csv() 函数有一个简单的参数,或者有一种方法可以应用于提取的数据集,以便 R 处理数据作为数字而不是字符串。

【问题讨论】:

  • 您应该提供一个虚拟数据。如果您的分隔符也是,,这可能是更复杂的问题。 =/
  • 也许你可以试试read.csv2?
  • @Marek,没错,如果分隔符是;,但可以轻松设置另一个分隔符字符串...

标签: r csv number-formatting


【解决方案1】:

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

(大陆)欧洲 csv 文件存在两个问题:

  1. csv 中的c 代表什么?对于标准 csv,这是一个 ,,对于欧洲 csv,这是一个 ;
    sep 是 read.table 中的相应参数
  2. 小数点的字符是什么?对于标准 csv,这是一个 .,对于欧洲 csv,这是一个 ,
    dec 是 read.table 中的相应参数

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

如果您的文件不遵循这些标准中的任何一个,请手动设置参数。

【讨论】:

  • 没有“欧洲 csv”之类的东西。您可能会参考德语/法语,...数字表示。但是,没有单一/简单的欧洲 csv :)
  • 你能指导一下如何读取逗号作为小数分隔符和字段分隔符的行吗?字段值由双引号分隔。我把这个问题搬到了here。
【解决方案2】:

来自?read.table:

dec     the character used in the file for decimal points.

是的,您也可以将其用于read.csv。 (对我来说:不傻,你不能!)

或者,你也可以使用

read.csv2

假设一个“,”小数分隔符和一个“;”用于列分隔符。

【讨论】:

    【解决方案3】:
    read.csv(... , sep=";")
    

    假设这个导入的字段叫做“金额”,如果你的数字被读取为字符,你可以这样修复类型:

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

    从 excel 或 excel csv 导入时,我经常遇到这种情况以及其他一些小烦恼。似乎没有一致的方法可以确保在导入 R 时获得您期望的结果,因此事后修复似乎是最好的方法。我的意思是,查看您导入的内容 - 确保它符合您的预期,如果不是,请修复它。

    【讨论】:

    • 我喜欢setAs 的解决方案,就像DWin 和Greg Snow 的答案一样
    【解决方案4】:

    可以如下使用:

    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
    

    【讨论】:

      【解决方案5】:

      如果您指明缺失值的表示方式(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
      

      【讨论】:

        【解决方案6】:

        也许

        as.is=T
        

        这也可以防止将字符列转换为因子

        【讨论】:

          【解决方案7】:

          只是为了补充上面布兰登的回答,这对我来说效果很好(我没有足够的代表发表评论):

          如果你正在使用

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

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

          【讨论】:

            猜你喜欢
            • 2012-01-02
            • 2022-10-17
            • 1970-01-01
            • 1970-01-01
            • 2011-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多