如何在R中的长文本字符串中替换以固定模式结尾的文本序列?

时间:2016-07-19 15:24:01

标签: r replace

我在数据框中有一个列,其中包含格式的长文本序列(通常为数千个字符):

p <- ggplot(data = d, aes(factor(group), r)) + 
  geom_boxplot()    +
  stat_summary(geom="text", fun.y=quantile,
             aes(label=sprintf("%1.0f", ..y..)),
             position=position_nudge(x=0.33), size=3)+
  facet_wrap(~group2, scales = "free_x") +
  geom_text(data = un, aes(x = group, y = 50, label = lab))

即。一个字符串,括号中的后缀,然后是分隔符

我试图计算R中的语法以删除以(VR)结尾的项目,包括尾随管道(如果存在),以便我离开:

abab(VR) | ddee(NR) | def(NR) | fff(VR) | oqq | pqq | ppf(VR)

我无法找出会删除这些条目的正则表达式(或gsub),并且想请求是否有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

以下是使用strsplitpaste与崩溃参数的方法:

paste(sapply(strsplit(temp, split=" +\\| +"),
        function(i) { i[setdiff(seq_along(i), grep("\\(VR\\)$", i))] }),
  collapse=" | ")
[1] "ddee(NR) | def(NR) | oqq | pqq"

我们在管道和空格上拆分,然后将结果列表提供给sapplygrep使用setdiff函数删除以“(VR)”结尾的向量的任何元素。最后,结果粘贴在一起。

我添加了一个带有{{1}}的子集方法,这样没有任何“(VR)”的向量将返回而不做任何修改。

答案 1 :(得分:1)

如果您想使用gsub,可以分两个阶段删除模式:

gsub(" \\| $", "", gsub("\\w+\\(VR\\)( \\| )?", "", s))
# firstly remove all words ending with (VR) and optional | following the pattern and 
# then remove the possible | at the end of the string

# [1] "ddee(NR) | def(NR) | oqq | pqq"
  • 正则表达式\\w+\\(VR\\)将匹配以(VR)结尾的单词,括号将由\\转义;
  • ( \\| )?匹配可选分隔符|,这可确保它在字符串的中间和末尾都匹配模式;
  • 字符串末尾遗漏的|可以被第二个gsub删除;