我有一张看起来像这样的表:

> dt
                   variant_id           transcript_id         0       1     2
    1: chr17_45630589_C_A_b38 chr17_46031704_46032046   1584;41  891;27 146;5
    2: chr17_45630589_C_A_b38 chr17_46032300_46033079    782;41  438;27  76;5
    3: chr17_45630589_C_A_b38 chr17_46033193_46033402    988;41  620;27 116;5
    4: chr17_45630589_C_A_b38 chr17_46033461_46034160   1162;41  725;27 133;5
    5: chr17_45630589_C_A_b38 chr17_46033470_46034160      0;41    0;27   0;5
   ---
37392:  chr9_34699703_G_C_b38  chr9_34648457_34648761 24060;256 2644;36  <NA>
37393:  chr9_34699703_G_C_b38  chr9_34648895_34648997 35276;256 3512;36  <NA>
37394:  chr9_34699703_G_C_b38  chr9_34648908_34648997   336;256   60;36  <NA>
37395:  chr9_34699703_G_C_b38  chr9_34649082_34649409 33640;256 3400;36  <NA>
37396:  chr9_34699703_G_C_b38  chr9_34649565_34650368 45540;256 4708;36  <NA>

我只想提取 0 下第一个分号分隔值等于 012 中第一个分号分隔值大于 0 的行,最好是 2 大于 1 的行。我自己尝试过这样做,但它导致了一个新列的值不是 0:
> test
                   variant_id           transcript_id         0       1     2
    1: chr17_45630589_C_A_b38 chr17_46031704_46032046   1584;41  891;27 146;5
    2: chr17_45630589_C_A_b38 chr17_46032300_46033079    782;41  438;27  76;5
    3: chr17_45630589_C_A_b38 chr17_46033193_46033402    988;41  620;27 116;5
    4: chr17_45630589_C_A_b38 chr17_46033461_46034160   1162;41  725;27 133;5
    5: chr17_45630589_C_A_b38 chr17_46033470_46034160      0;41    0;27   0;5
   ---
37392:  chr9_34699703_G_C_b38  chr9_34648457_34648761 24060;256 2644;36  <NA>
37393:  chr9_34699703_G_C_b38  chr9_34648895_34648997 35276;256 3512;36  <NA>
37394:  chr9_34699703_G_C_b38  chr9_34648908_34648997   336;256   60;36  <NA>
37395:  chr9_34699703_G_C_b38  chr9_34649082_34649409 33640;256 3400;36  <NA>
37396:  chr9_34699703_G_C_b38  chr9_34649565_34650368 45540;256 4708;36  <NA>
       0_new   1_new 2_new
    1:     0  891,27 146,5
    2:     0  438,27  76,5
    3:     0  620,27 116,5
    4:     0  725,27 133,5
    5:     1    0,27   0,5
   ---
37392:     0 2644,36    NA
37393:     0 3512,36    NA
37394:     0   60,36    NA
37395:     0 3400,36    NA
37396:     0 4708,36    NA

它也非常断然没有按照我想要的方式工作。我该怎么做?

编辑:
> dput(head(as.data.frame(dt)))
structure(list(variant_id = c("chr17_45630589_C_A_b38", "chr17_45630589_C_A_b38",
"chr17_45630589_C_A_b38", "chr17_45630589_C_A_b38", "chr17_45630589_C_A_b38",
"chr17_45630589_C_A_b38"), transcript_id = c("chr17_46031704_46032046",
"chr17_46032300_46033079", "chr17_46033193_46033402", "chr17_46033461_46034160",
"chr17_46033470_46034160", "chr17_46034280_46038537"), `0` = c("1584;41",
"782;41", "988;41", "1162;41", "0;41", "5;41"), `1` = c("891;27",
"438;27", "620;27", "725;27", "0;27", "4;27"), `2` = c("146;5",
"76;5", "116;5", "133;5", "0;5", "0;5")), row.names = c(NA, 6L
), class = "data.frame")

最佳答案

该问题相当于 0 列的第一个字符为“0”,12 列的第一个字符不为 0 或减号。这里 dt 是一个 data.table。使用这种方法,我们不必拆分值。

dt[grepl("^0", `0`) & !grepl('^[-0]', `1`) & !grepl('^[-0]', `2`)]

在问题中没有负值,如果我们知道这些值从不为负,一般来说,它可以简化为:
dt[grepl("^0", `0`) & !grepl('^0', `1`) & !grepl('^0', `2`)]

或者
dt[startsWith(`0`, "0") & !startsWith(`1`, "0") & !startsWith(`2`, "0")]

关于r - 如何根据分号分隔列中的值过滤行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59990844/

10-12 14:02