【问题标题】:reading comma-separated strings with read.csv()使用 read.csv() 读取逗号分隔的字符串
【发布时间】:2017-12-21 00:50:42
【问题描述】:

我正在尝试加载一个逗号分隔的数据文件,该文件的一个文本列中也包含逗号。下面的示例代码会生成这样一个文件'test.csv',,我将使用read.csv() 加载该文件以说明我的问题。

> d <- data.frame(name = c("John Smith", "Smith, John"), age = c(34, 34))
> d
         name age
1  John Smith  34
2 Smith, John  34
> write.csv(d, file = "test.csv", quote = F, row.names = F)
> d2 <- read.csv("test.csv")
> d2
            name age
John Smith    34  NA
Smith       John  34

由于Smith, John 中的','d2 分配不正确。如何读取文件以使d2 看起来与d 完全一样?

谢谢。

【问题讨论】:

  • 问题是你用quote=F写的文件。把它拿走,它应该可以工作。
  • 谢谢,但我的问题是文件按原样发送给我。我使用这个示例代码来创建这样一个文件。
  • @Manojit 您需要转义文件中的 CSV 条目,因为其中一些数据本身包含逗号。如果没有引号,read.csv 将在第二行看到:Smith, John, 34 ... 即它将看到 三个 列。
  • @Manojit 是只有一列有逗号,还是有多列有这个问题。
  • @TimBiegeleisen 谢谢。不幸的是,正如我之前解释的,文件不是我自己写的,它是按原样发送给我的(write.csv()bit 是为了生成一个示例文件来说明我的问题)。我想read.csv()read.table(),没有简单的方法可以做到这一点,我可能需要使用 Excel 之类的工具来编辑它。

标签: r read.csv


【解决方案1】:

1) read.pattern read.pattern(在 gsubfn 包中)可以读取此类文件:

library(gsubfn)

pat <- "(.*),(.*)"
read.pattern("test.csv", pattern = pat, header = TRUE, as.is = TRUE)

给予:

         name age
1  John Smith  34
2 Smith, John  34

2) 两遍 另一种可能是读入,修复它,然后重新读取。这不使用任何包并提供相同的输出。

L <- readLines("test.csv")
read.table(text = sub("(.*),", "\\1|", L), header = TRUE, sep = "|", as.is = TRUE)

注意:对于 3 个字段,第三个字段在末尾,请在 (1) 中使用

pat <- "(.*),([^,]+),([^,]+)"

同样的情况在 (2) 中使用它,假设最后两个逗号相邻有非空格,并且文本字段中的任何逗号相邻至少有一个空格,并且字段至少有 2 个字符:

text = gsub("(\\S),(\\S)", "\\1|\\2", L)

如果您有其他安排,只需适当修改 (1) 中的正则表达式和 (2) 中的 subgsub

【讨论】:

  • 谢谢!这解决了test.csv.我的实际文件在文本列之前还有另一个数字列的问题。我应该如何为该文件调整read.table()syntax?
  • 已将评论移至答案末尾的备注。
  • 谢谢!pat &lt;- "([^,]+),(.*),(.*)"使用按“数字”、“文本”、“数字”顺序排列的文件。我如何在这个文件中使用你的方法#2?
  • 好的 - 当我输入我之前的评论时,你已经回答了。再次感谢!
  • read.patternread.table 中使用quote = "" 禁用引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多