【问题标题】:extract only letters after _ with numbers inbetween仅提取 _ 之后的字母,中间有数字
【发布时间】:2018-05-23 22:11:39
【问题描述】:

所以我有两列看起来像这样:

    V1                                V2
    ENSP00000222573_N559D             ENSG00000105855
    ENSP00000222573_N559D             ENSG00000105855
    ENSP00000267853_E337*             ENSG00000108239
    ENSP00000299441_R1672P,R1672G     ENSG00000127415
    ENSP00000334642_K277N.            ENSG00000134324
    ENSP00000342952_N585R             ENSG00000134324

首先,我需要在第一列提取 _ 之后的所有字母/符号 所以结果需要如下所示:

V1      V2
ND      ENSG00000105855
ND      ENSG00000105855
E*      ENSG00000108239
RP,RG   ENSG00000127415
KN      ENSG00000134324
NR      ENSG00000134324

然后我想过滤,只有当 V1 和 V2 都加倍时,它们才会被过滤掉。 所以最终的结果是:

  V1      V2
    ND      ENSG00000105855
    E*      ENSG00000108239
    RP,RG   ENSG00000127415
    KN      ENSG00000134324
    NR      ENSG00000134324

【问题讨论】:

    标签: r string unique substr


    【解决方案1】:

    一个选项可以使用 sapplystrsplit 作为:

    sapply(df, function(x){
     sapply(strsplit(x, split = "_"), function(y){
       if(length(y)<2){
         y
       } else {
         gsub("[0-9]+","",y[2])
       }
     })
      }) %>% as.data.frame() %>% distinct()
    
    
    #      V1              V2
    # 1    ND ENSG00000105855
    # 2    E* ENSG00000108239
    # 3 RP,RG ENSG00000127415
    # 4   KN. ENSG00000134324
    # 5    NR ENSG00000134324
    

    数据:

    df <- read.table(text = 
     "V1                                V2
    ENSP00000222573_N559D             ENSG00000105855
    ENSP00000222573_N559D             ENSG00000105855
    ENSP00000267853_E337*             ENSG00000108239
    ENSP00000299441_R1672P,R1672G     ENSG00000127415
    ENSP00000334642_K277N.            ENSG00000134324
    ENSP00000342952_N585R             ENSG00000134324",
    stringsAsFactors = FALSE, header = TRUE)
    

    【讨论】:

    • @www 你的答案很聪明。感谢您的反馈。让我删除重复的。
    • 运行顺畅!感谢您的努力。
    【解决方案2】:

    使用 的解决方案。 dat2 是最终输出。

    library(tidyverse)
    
    dat2 <- dat %>%
      separate(V1, into = c("Re", "V1"), sep = "_") %>%
      select(-Re) %>%
      mutate(V1 = str_replace_all(V1, "[0-9]*", "")) %>%
      distinct(V1, V2, .keep_all = TRUE)
    dat2
    #      V1              V2
    # 1    ND ENSG00000105855
    # 2    E* ENSG00000108239
    # 3 RP,RG ENSG00000127415
    # 4   KN. ENSG00000134324
    # 5    NR ENSG00000134324
    

    数据

    dat <- read.table(text = "V1                                V2
        ENSP00000222573_N559D             ENSG00000105855
                      ENSP00000222573_N559D             ENSG00000105855
                      'ENSP00000267853_E337*'             ENSG00000108239
                      'ENSP00000299441_R1672P,R1672G'     ENSG00000127415
                      'ENSP00000334642_K277N.'            ENSG00000134324
                      ENSP00000342952_N585R             ENSG00000134324",
                      header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 太棒了,它有效!非常感谢您的快速回答!
    猜你喜欢
    • 2019-05-18
    • 2020-08-19
    • 2014-05-10
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多