删除字符串中的其他字符,除了包含R中某些模式的所需单词

时间:2017-01-21 01:52:16

标签: r

我有一个包含某些字符串的向量,除了包含特定模式的单词(这里是mir)之外,我想删除每个字符串中的其他部分。

s <- c("a mir-96 line (kk27)", "mir-133a cell", "d mir-14-3p in", "m mir133 (sas)", 
                                                                    "mir_23_5p r 27")

我想获得:

mir-96`, `mir-133a`, `mir-14-3p`, `mir133`, `mir_23_5p`

我知道这个想法:使用gsub(),模式是:a word beginning with (or including) **mir**

但我不知道如何构建这样的模式。

还是其他想法?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

基本R中的一种方法是将每个字符串拆分为单词,然后仅提取其中包含mir的字符串

unlist(lapply(strsplit(s, " "), function(x) grep("mir", x, value = TRUE)))
#[1] "mir-96"    "mir-133a"  "mir-14-3p" "mir133"    "mir_23_5p"

根据@Rich Scriven在评论中的建议,我们可以unlist使用lapply保存sapply步骤

sapply(strsplit(s, " "), function(x) grep("mir", x, value = TRUE))

答案 1 :(得分:1)

我们可以使用sub匹配零个或多个字符(.*),后跟字边界(\\b),后跟字符串(mir和一个或多个不是空格(\\S+)的字符,通过放置在(...)后面跟随其他字符将其捕获为一个组,并在替换中使用捕获的组的反向引用({{1} })

\\1

更新

如果有多个&#39; mir。*&#39; substring,然后我们想要提取具有一些数字部分的字符串

sub(".*\\b(mir\\S+).*", "\\1", s)
#[1] "mir-96"    "mir-133a"  "mir-14-3p" "mir133"    "mir_23_5p"

数据

sub(".*\\b(mir[^0-9]*[0-9]+\\S*).*", "\\1", s1)
#[1] "mir-96"    "mir-133a"  "mir-14-3p" "mir133"    "mir_23_5p" "mir_23-5p"