R:在逗号之间提取单词?

时间:2019-11-23 17:59:42

标签: r string word

说我有一个字符串,其中的各个单词用逗号分隔。

"Hello, 1000, "Oh shit, a comma", helloagain"

我想要一个这样的字符串,并给定值n,提取第n个和第(n + 1)个逗号之间的单词。

例如,如果n = 1,我想提取1000。 如果为n = 2,我要提取"Oh shit, a comma"。依此类推。

我该怎么做?

请注意,逗号之间的单词可以在引号中包含逗号...,也可以为空,例如字符串也可以是

"Hello,, 1000"

对于n = 1,我们需要单词""

1 个答案:

答案 0 :(得分: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或{{1}的念头。 }。确实没有必要尝试使用正则表达式(https://xkcd.com/1171/)重塑轮子。

read.table

如果您的所有字符串矢量都具有相同数量的逗号/字段,则可以按原样使用此

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