【问题标题】:R extract a part of a string in RR在R中提取字符串的一部分
【发布时间】:2012-09-15 23:35:53
【问题描述】:

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

【问题讨论】:

  • 老兄,只需将其保存到文本文件中并运行 grep 或类似的东西。您使用了错误的工具。
  • 1) 请通过向我们提供一些我们可以轻松放入 R 会话中的代码来使您的示例可重现,2) 在 linux/unix 上尝试 mclapply() 或在 Windows 上尝试 parlapply 以并行运行它.您可能也可以使您的功能更快,但我不会通过将您的数据放入我的 R 会话来找出答案。
  • 你能澄清一下“HG-Focus:”是否应该是输出的一部分?
  • HG-Focus 不应该出现在输出中。

标签: string r lapply


【解决方案1】:

使用正则表达式:

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

一点解释:

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

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

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

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

【讨论】:

  • 很抱歉没有这么具体。 HG-FOCUS 可能是其他文件中的不同字符串。
  • 工作。但你能解释一下吗(特别是“\\2”)
【解决方案2】:

迂回技巧:

sapply(strsplit(sapply(strsplit(nm, "e:"), "[[", 2), ";"), "[[", 1)

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多