[英]R: Extracting word between commas?
假设我有一个字符串,其中包含以逗号分隔的各种单词。
"Hello, 1000, "Oh shit, a comma", helloagain"
我想取这样一个字符串,并给定一个值n
,提取第 n 个和第 (n+1) 个逗号之间的单词。
因此,例如,如果n = 1
,我想提取1000
。 如果n = 2
,我想提取"Oh shit, a comma"
。 等等。
我该怎么做呢?
请注意,逗号之间的单词可以在引号中包含逗号...也可以为空,例如字符串也可以是
"Hello,, 1000"
对于n = 1
,我们想要单词""
。
假设您打算将引用的字符串保持在一起(未拆分),这是一个尝试:
s <- "Hello, 1000, \"Oh shit, a_comma\", helloagain"
gre <- gregexpr("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'", s)
unlist(lapply(regmatches(s, gre), function(z) {
ifelse(grepl('^"', z), z,
strsplit(gsub('"', '', z), "[ ,]+"))
}))
# [1] "Hello" "1000" "\"Oh shit, a_comma\"" ""
# [5] "helloagain"
从这里开始,它只是简单的索引。
另一个可能更好的选择,注意有人可能已经想出了如何正确标记可选引用的分隔文本(当以这种方式表达时,可能会引发read.csv
或read.table
的想法)。 没有真正需要尝试使用正则表达式( https://xkcd.com/1171/ )重新发明轮子。
read.csv(text = s, header = FALSE, stringsAsFactors = FALSE)
# V1 V2 V3 V4
# 1 Hello 1000 Oh shit, a_comma helloagain
如果您的字符串向量都具有相同数量的逗号/字段,那么您可以按原样使用它:
read.csv(text = rep(s, 3), header = FALSE, stringsAsFactors = FALSE)
# V1 V2 V3 V4
# 1 Hello 1000 Oh shit, a_comma helloagain
# 2 Hello 1000 Oh shit, a_comma helloagain
# 3 Hello 1000 Oh shit, a_comma helloagain
但是,如果它们有不同数量的逗号,则需要手动迭代它们:
out <- lapply(rep(s, 3), function(a) read.csv(text = a, header = FALSE, stringsAsFactors = FALSE))
out
# [[1]]
# V1 V2 V3 V4
# 1 Hello 1000 Oh shit, a_comma helloagain
# [[2]]
# V1 V2 V3 V4
# 1 Hello 1000 Oh shit, a_comma helloagain
# [[3]]
# V1 V2 V3 V4
# 1 Hello 1000 Oh shit, a_comma helloagain
然后你可以从每个中获取第n
个:
sapply(out, `[[`, 2)
# [1] 1000 1000 1000
或每个不同的索引位置:
mapply(`[[`, out, c(1,3,2))
# [1] "Hello" " Oh shit, a_comma" "1000"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.