1

我有 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
4

2 回答 2

7

使用正则表达式:

sub("probe:(.*?):(.*?);.*$", "\\2", nm, perl = TRUE)

一点解释:

  1. .意思是“任何字符”。
  2. .*意思是“任意数量的字符”。
  3. .*?意思是“任意数量的字符,但不要贪婪。
  4. 括号内的模式被捕获并分配给\\1,\\2等。
  5. $表示行尾(或字符串)。

所以在这里,模式匹配整行,并通过两个捕获两件事(.*?)HG-Focus你不想要的(或其他)东西 as\\1和你的 id as \\2。通过将替换设置为\\2,我们有效地将整个字符串替换为您的 id。

我现在意识到没有必要捕捉第一件事,所以这也可以:

sub("probe:.*?:(.*?);.*$", "\\1", nm, perl = TRUE)
于 2012-09-15T23:57:17.427 回答
1

迂回技术:

sapply(strsplit(sapply(strsplit(nm, "e:"), "[[", 2), ";"), "[[", 1)
于 2012-09-16T00:36:54.350 回答