我有一张看起来像这样的表:
> 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
下第一个分号分隔值等于 0
且 1
和 2
中第一个分号分隔值大于 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”,1
和 2
列的第一个字符不为 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/