之前可能已经提出过这个问题,但我找不到。我有一个CSV文件列表(439左右),在一些文件中,有人也在编辑评论中使用了逗号。结果是我无法将文件放入数据框中,因为文件在拆分后现在没有相同数量的元素。无论如何,我面临的问题看起来像这样:
vec1 <- paste("484,1213,0,62.0006,1,go -- late F1 max, but glide?")
vec2 <- paste("467,1387,0,62.0026,1,goes2")
ls <- list(vec1, vec2)
我想要做的是拥有一个包含六列的数据框。如果vec1
的编辑评论中没有逗号,我可以使用(并且一直在使用,直到我发现这个有问题的例子)以下内容:
df <- ldply(ls, function(x)unlist(strsplit(x[1], split = ",")))
但是,我收到明显的错误消息,结果的长度数量不同。有没有办法摆脱那个逗号,或者把它变成一个分号,或者确保如果一个向量中有7个元素,6和7组合在一起?
如果它有帮助,这就是我在读R中的文件的方式(我正在使用scan
,因为我想要的文件中还有其他信息。这里还有一些奇怪的编码问题,但这似乎工作)。
data <- scan(file, fileEncoding="latin1", blank.lines.skip = FALSE, what = "list", sep = "\n", quiet = TRUE)
答案 0 :(得分:2)
如果您需要评论,仍然可以用分号替换第6个逗号并使用以前的解决方案:
gsub("((?:[^,]*,){5}[^,]*),", "\\1;", vec1, perl=TRUE)
正则表达式解释:
((?:[^,]*,){5}[^,]*)
- 我们将在替换模式中以\\1
作为第1组引用的捕获组,匹配
(?:[^,]*,){5}
- 5个非逗号字符序列,后跟逗号[^,]*
- 0个或更多非逗号,
- 我们将在替换中变成;
的逗号或者(正如@CathG指出的那样,\\K
运算符也可以与类似Perl的表达式一起使用)
sub("^([^,]+,){5}[^,]+\\K,", ";", vec1, perl=T)
转义序列
\K
导致任何先前匹配的字符不包含在最终匹配序列中。
但是,它不会“标准化”可能跟随的任何其他逗号。