如何读取包含千位分隔符和零的特殊处理(在 R 中)的 .csv 数据?

Posted

技术标签:

【中文标题】如何读取包含千位分隔符和零的特殊处理(在 R 中)的 .csv 数据?【英文标题】:How to read .csv-data containing thousand separators and special handling of zeros (in R)? 【发布时间】:2015-11-02 08:50:05 【问题描述】:

Ubuntu 14.04 上的 R 版本 3.2.2

我正在尝试读取包含千位分隔符“,”的 R .csv 数据(两列:“id”和“variable1”)。 到目前为止没有问题。我正在使用 read.csv2,数据看起来像这样:

> data <- read.csv2("data.csv", sep = ";", stringsAsFactors = FALSE, dec = ".")
> data[1000:1010, ]
     id        variable1
         1     2,001
     1,001     2,002
     1,002     2,001
     1,003     2,002
     1,004     2,001
     1,005     2,002
     1,006     2,001
     1,007     2,002
     1,008     2,001
     1,009     2,002
      1,01     2,001

在那之后,我首先尝试使用 gsub() 删除逗号:

data[, c("id", "variable1")] <- sapply(data[, c("id", "variable1")],
          function(x) as.numeric(gsub("\\,","", as.character(x))))
> data[1000:1010, ]
     id      variable1
        1      2001
     1001      2002
     1002      2001
     1003      2002
     1004      2001
     1005      2002
     1006      2001
     1007      2002
     1008      2001
     1009      2002
      101      2001

我认为我的问题在第一个输出中已经很明显了,因为有千位分隔符,但缺少“结尾零”。对于数据中的“id”变量(也在 .csv 数据中),数字“1000”仅显示为“1”,而“1010”显示为“1,01”。当然,R 无法识别这一点。

所以我的问题是:有没有办法告诉 R 在读取数据时(或者可能在那之后)每个数字在千位分隔符之后必须有三个数字,以便我有正确的数字? 数据应如下所示:

> data[1000:1010, ]
     id      variable1
     1000      2001
     1001      2002
     1002      2001
     1003      2002
     1004      2001
     1005      2002
     1006      2001
     1007      2002
     1008      2001
     1009      2002
     1010      2001

编辑: 谢谢大家的回答。不幸的是,这些建议适用于这个示例,但不适用于我的数据,因为我认为我选择了错误的示例行。数据中的其他行可能如下所示:

       id1 variable1
1        1     2,001
999    999     1,102
1000     1     2,001
1001 1,001     2,002
1002 1,002     2,001

当然,有两倍的数字“1”。第一个确实是“1”,但第二个应该是“1000”。但现在我认为我无法用 R 解决我的问题。也许我需要更好地导出原始数据,因为问题也出现在 .csv 数据中。

【问题讨论】:

您可以通过在read.csv 中指定colClasses=c('character', 'character') 来阅读吗? 不,缺少零的问题已经出现在 .csv 数据中。所以我当然看不到 R 中的零点,因为它们不存在。我正在寻找像“如何添加”R 中的零这样的解决方案。 所以,我猜实际的 11000 将只有 1? read.csv2 应该将, 解释为小数点,就像这些数字看起来一样。如果它确实将它们解释为这样,您可以乘以 1000 以获得所需的输出。 【参考方案1】:

如果“,”是唯一的分隔符,即所有数字都是整数,您可以将csv2(或read.csv)的dec参数设置为“,”并乘以1000:

data <- read.csv2(
  text = "id    ; variable1
          1     ; 2,001
          1,008 ; 2,001
          1,009 ; 2,002
          1,01  ; 2,001
          1,3   ; 2,0",
  sep = ";",
  stringsAsFactors = FALSE,
  header = TRUE,
  dec = "," )

.

> 1000*data
    id variable1
1 1000      2001
2 1008      2001
3 1009      2002
4 1010      2001
5 1300      2000
> 

【讨论】:

【参考方案2】:

删除逗号后,您可以执行以下操作:

data$id <- data$id*(10^(4-nchar(data$id)))

【讨论】:

以上是关于如何读取包含千位分隔符和零的特殊处理(在 R 中)的 .csv 数据?的主要内容,如果未能解决你的问题,请参考以下文章

当某些数字包含逗号作为千位分隔符时如何读取数据?

将千位分隔符添加到任何数字,即使它包含特殊字符

js判断一个数组中正负数和零的个数,要用到switch语句!

如何使用 pandas.read_csv 在双引号之间读取带有千位分隔符的数字 [重复]

在 Swift 中将小数点后的逗号和零值添加到千位后的数字字符串中

读取所有列合并为一个的csv文件:千位逗号问题