我有一个csv文件,其行如下所示:
2, 3, c(a, b, c), o, d
我想读取这个csv但是将矢量c(a,b,c)保存在一列(变量)中。我正在考虑阅读我的CSV文件并更改这些向量中的分隔符(逗号)。例如,我会将前一个向量更改为以下内容:
2, 3, c(a; b; c), o, d
当我读取csv文件(read.csv)时,它不会将向量解析为单独的变量。我试图弄清楚我应该使用的正则表达式。
text <- "2, 3, c(a, b, c), o, d"
gsub("(c\\([a-z]?)(,)", "\\1;", text) #Something similar to this but as you could see I am struggling
该解决方案适用于以下情况:
2, 3, c(a), o, d
2, 3, c(a, b), o, d
2, 3, c(a, b, c, d), o, d
我正在尝试在R中执行此操作,因此除了使用gsub之外的任何其他程序包都可以。
答案 0 :(得分:0)
1)用&#34; c(...)&#34;替换每个c(...);正如@bezet在评论中所建议的那样,然后使用read.table
阅读它。没有包使用。
Lines <- rep("2, 3, c(a, b, c), o, d", 3) # sample input
Lines2 <- gsub('(c\\(.*?\\))', '"\\1"', Lines)
read.table(text = Lines2, sep = ",")
代码给出了这个数据框:
V1 V2 V3 V4 V5
1 2 3 c(a, b, c) o d
2 2 3 c(a, b, c) o d
3 2 3 c(a, b, c) o d
2)此解决方案与问题中建议的一致,我们用c(...)部分中的分号替换命令。匹配(...)的每个最短事件,并在每个调用指定的gusb
内用逗号分隔逗号。然后用|替换剩余的逗号字符和分号回到逗号。最后,使用read.table
与sep="|"
一起阅读。
library(gsubfn)
Lines2 <- gsubfn("\\(.*?\\)", ~ gsub(",", ";", x), Lines, perl = TRUE)
Lines2 <- chartr(";,", ",|", Lines2)
read.table(text = Lines2, sep = "|")
3)或者如果您知道精确的表单与指定模式的每一行匹配,read.pattern
给出与输出相同的数据框。
library(gsubfn)
read.pattern(text = Lines, pattern = "^(\\S+), (\\S+), (\\S.+\\)), (\\S+), (\\S+)$")