String R提取R中字符串的一部分

String R提取R中字符串的一部分,string,r,lapply,String,R,Lapply,我有500万个序列(探针是特定的),如下所示。我需要从每个字符串中提取名称 这里的名字是1007_s_at:123:381、10073_s_at:128:385等等 我正在使用lappy函数,但它占用了太多的时间。我还有其他几个类似的文件。你能建议一种更快的方法吗 nm = c( "probe:HG-Focus:1007_s_at:123:381; Interrogation_Position=3570; Antisense;", "probe:HG-Focus:1007_s_at:1

我有500万个序列(探针是特定的),如下所示。我需要从每个字符串中提取名称

这里的名字是1007_s_at:123:381、10073_s_at:128:385等等

我正在使用lappy函数,但它占用了太多的时间。我还有其他几个类似的文件。你能建议一种更快的方法吗

 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)

使用正则表达式:

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

  • 表示“任何字符”
  • *
    表示“任意数量的字符”
  • *?
    表示“任意数量的字符,但不要贪心
  • 括号内的图案被捕获并分配给
    \\1
    \\2
  • $
    表示行尾(或字符串)
  • 因此,在这里,模式匹配整行,并通过两个
    (.*?
    )捕获两个内容:您不想要的
    HG Focus
    (或其他)内容为
    \\1
    ,您的id为
    \\2
    。通过将替换设置为
    \\2
    ,我们有效地将整个字符串替换为您的id

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

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

    使用正则表达式:

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

  • 表示“任何字符”
  • *
    表示“任意数量的字符”
  • *?
    表示“任意数量的字符,但不要贪心
  • 括号内的图案被捕获并分配给
    \\1
    \\2
  • $
    表示行尾(或字符串)
  • 因此,在这里,模式匹配整行,并通过两个
    (.*?
    )捕获两个内容:您不想要的
    HG Focus
    (或其他)内容为
    \\1
    ,您的id为
    \\2
    。通过将替换设置为
    \\2
    ,我们可以有效地用您的id替换整个字符串

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

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

    迂回技术:

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

    迂回技术:

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

    伙计,把它存到一个文本文件里,然后运行grep之类的程序。您使用了一个错误的工具。1)请为我们提供一些可以轻松放入R会话中的代码,使您的示例具有可复制性;2)在linux/unix上尝试
    mclappy()
    ,或在Windows上尝试
    parlappy
    ,以并行运行。你可能也可以让你的函数更快,但我不会把你的数据放到我的R会话中去找出答案。你能澄清一下“HG Focus:”是否应该是输出的一部分吗?HG Focus不应该出现在输出中。伙计,把它保存到一个文本文件中,然后运行grep或类似的东西。您使用了一个错误的工具。1)请为我们提供一些可以轻松放入R会话中的代码,使您的示例具有可复制性;2)在linux/unix上尝试
    mclappy()
    ,或在Windows上尝试
    parlappy
    ,以并行运行。您可能也可以使您的功能更快,但我不会通过将您的数据输入我的R会话来了解。您能否澄清“HG Focus:”是否应该是输出的一部分?HG Focus不应该出现在输出中。我很抱歉没有这么具体。HG-FOCUS在其他文件中可能是不同的字符串。但是请你解释一下(特别是“\\2”)我很抱歉没有说得那么具体。HG-FOCUS在其他文件中可能是不同的字符串。但是你能解释一下吗(特别是“\\2”)