我有一个包含某些字符串的向量,除了包含特定模式的单词(这里是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**
。
但我不知道如何构建这样的模式。
还是其他想法?
任何帮助将不胜感激!
答案 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"