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. $行(または文字列)の終わりを意味します。

したがって、ここでは、パターンは行全体に一致し、2 つのものを介して 2 つのものを(.*?)キャプチャしHG-Focusます。置換を に設定することで、文字列全体を効果的に ID に置き換えます。\\1\\2\\2

最初のものをキャプチャする必要はなかったので、これでも同様に機能することがわかりました。

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 に答える