我有500万个序列(探针具体)如下。我需要从每个字符串中提取名称。
这里的名字是1007_s_at:123:381,10073_s_at:128:385等等..
我正在使用lapply功能但是花费了太多时间。我还有其他几个类似的文件。你会建议一个更快的方法来做到这一点。
nm = c(
"probe:HG-Focus:1007_s_at:123:381; Interrogation_Position=3570; Antisense;",
"probe:HG-Focus:1007_s_at:128:385; Interrogation_Position=3615; Antisense;",
"probe:HG-Focus:1007_s_at:133:441; Interrogation_Position=3786; Antisense;",
"probe:HG-Focus:1007_s_at:142:13; Interrogation_Position=3878; Antisense;" ,
"probe:HG-Focus:1007_s_at:156:191; Interrogation_Position=3443; Antisense;",
"probe:HTABC:1007_s_at:244:391; Interrogation_Position=3793; Antisense;")
extractProbe <- function(x) sub("probe:", "", strsplit(x, ";", fixed=TRUE)[[1]][1], ignore.case=TRUE)
pr = lapply(nm, extractProbe)
输出
1007_s_at:123:381
1007_s_at:128:385
1007_s_at:133:441
1007_s_at:142:13
1007_s_at:156:191
1007_s_at:244:391
答案 0 :(得分:7)
使用正则表达式:
sub("probe:(.*?):(.*?);.*$", "\\2", nm, perl = TRUE)
一点解释:
.
表示“任何角色”。.*
表示“任意数量的字符”。.*?
表示“任意数量的字符,但不要贪婪。\\1
,\\2
等。$
表示行尾(或字符串)。所以在这里,模式匹配整行,并通过两个(.*?)
捕获两件事:HG-Focus
(或其他)你想要的东西\\1
和你的id为\\2
。通过将替换设置为\\2
,我们实际上会用您的ID替换整个字符串。
我现在意识到没有必要抓住第一件事,所以这也会起作用:
sub("probe:.*?:(.*?);.*$", "\\1", nm, perl = TRUE)
答案 1 :(得分:1)
迂回技术:
sapply(strsplit(sapply(strsplit(nm, "e:"), "[[", 2), ";"), "[[", 1)