我正在尝试加载逗号分隔的数据文件,该文件在其一个文本列中也有逗号。以下示例代码生成了一个文件'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
完全相同?
感谢。
答案 0 :(得分:5)
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个字符: / p>
text = gsub("(\\S),(\\S)", "\\1|\\2", L)
如果您有其他安排,只需在(1)中正确修改正则表达式,并在(2)中修改sub
或gsub
。