【问题标题】:How do you select multiple values for grep across multiple columns in R?如何在 R 中的多个列中为 grep 选择多个值?
【发布时间】:2021-01-27 15:58:29
【问题描述】:

这是我的第一个问题,对不起,如果我做错了,很抱歉这么长......

我有一张来自整个属的基因组表,我想在较小的水平上进行比较,例如在一个或多个物种内进行比较。我的表包含 3 列:p1、p2 和百分比标识。我的行是每个物种之间的比较。

p1 和 p2 一样包含基因组列表。以最低数字开头的任何数字都放在 p1 中,而具有较高数字的数字放在 p2 中。基因组名称的格式为 1_1_1,因此 p1 可能是 1_1_1,p2 可能是 2_1_1200,但如果 p2 是 3_1_23,则在下一行中 p1 可能是 2_1_1200。第三列是它们之间的百分比同一性,但我认为不应该相关。

多个基因组属于同一个物种,但它们没有任何顺序。例如,42、54、210 和 694 是同一物种。我只想找到 p1 和 p2 都包含这些数字的行,所以 42 到 54、54 到 210 等,但不是 1 到 42。这个物种只有 4 个基因组,但有些有多达 582 个要比较.

到目前为止: 它们是细菌基因组,所以基因顺序不一样,第三位对应基因位置,所以我一直用“^42”来称呼42_1_622。我不想要 642_1,所以我将 42 锚定到开头。所有中间数字都是 1。

subset_species_1 <- rbind(x[grep("^42_", x$p1), ], 
            x[grep("^42_", x$p2), ], 
            x[grep("^54_", x$p1), ], 
            x[grep("^54_", x$p2), ],
            x[grep("^210_", x$p1), ],
            x[grep("^210_", x$p2), ],
            x[grep("^694_", x$p1), ],
            x[grep("^694_", x$p2), ])

这显然很乏味,它给了我在任一列中包含任何这些基因组的所有行,而不仅仅是在两列中包含这些基因组的行。

另外,每张表只代表一个基因,理想情况下,我想为每张表使用相同的子集,其中有数千个。

提前谢谢你,我需要我能得到的所有帮助!

编辑添加:我在 R/Rstudio 中这样做

【问题讨论】:

    标签: r substring subset


    【解决方案1】:

    这样的事情怎么样。与其使用正则表达式来查找开头,不如将第一个下划线之前的数字与其余数字分开,看看它们是否在某个预定义的值向量中。这就是我在下面所做的,find_vals 是我正在寻找的值。

    library(glue)
    library(dplyr)
    library(stringr)
    set.seed(402943)
    dat <- tibble(
      p1 = glue("{sample(1:250, 250, replace=TRUE)}_1_{sample(1:250, 250, replace=TRUE)}"), 
      p2 = glue("{sample(1:250, 250, replace=TRUE)}_1_{sample(1:250, 250, replace=TRUE)}"),
      p = runif(250, 0,1)
    )
    
    find_vals <- as.character(42:100)
    dat %>% mutate(p11 = str_split(p1, "_", simplify=TRUE)[,1], 
                  p21 = str_split(p2, "_", simplify=TRUE)[,1]) %>% 
      filter(p11 %in% find_vals & p21 %in% find_vals)
    # A tibble: 16 x 5
    #   p1       p2            p p11   p21  
    #   <glue>   <glue>    <dbl> <chr> <chr>
    # 1 54_1_222 93_1_180 0.626  54    93   
    # 2 61_1_47  48_1_47  0.639  61    48   
    # 3 74_1_89  99_1_42  0.556  74    99   
    # 4 54_1_71  87_1_144 0.287  54    87   
    # 5 54_1_10  71_1_140 0.216  54    71   
    # 6 57_1_242 79_1_107 0.238  57    79   
    # 7 70_1_185 71_1_55  0.538  70    71   
    # 8 48_1_140 80_1_139 0.0752 48    80   
    # 9 72_1_105 62_1_56  0.213  72    62   
    # 10 70_1_241 64_1_220 0.857  70    64   
    # 11 57_1_213 97_1_47  0.432  57    97   
    # 12 55_1_56  45_1_249 0.907  55    45   
    # 13 55_1_9   44_1_156 0.633  55    44   
    # 14 59_1_153 96_1_228 0.154  59    96   
    # 15 61_1_97  99_1_189 0.556  61    99   
    # 16 83_1_56  86_1_85  0.787  83    86   
    # 
    
    

    【讨论】:

    • 为什么我必须进行字符串拆分?有没有办法用子字符串填充它,或者我必须使用整数来代替?我不明白为什么更改名称会对我有所帮助。
    • 我最终在变量上先做一列,然后再做另一列。谢谢!
    • @electricfitz 使用子字符串需要您知道要查找的字符串的长度。如果它总是一样,那会很好,但如果它是可变的,那么正则表达式方法会更好。
    猜你喜欢
    • 2018-03-26
    • 2018-05-15
    • 1970-01-01
    • 2018-06-18
    • 2022-06-23
    • 2015-05-07
    • 2012-12-05
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多