gpt4 book ai didi

r - 如何根据以分号分隔的列中的值过滤行?

转载 作者:行者123 更新时间:2023-12-01 11:11:21 25 4
gpt4 key购买 nike

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

> 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、1 和 2 列的第一个值提取为数字。然后像往常一样过滤:

dt[, paste0("firstValue_", 0:2) := lapply(.SD, function(i) tstrsplit(i, split = ";", type.convert = TRUE)[[ 1 ]]), .SDcol = 3:5] 

dt
# variant_id transcript_id 0 1 2 firstValue_0 firstValue_1 firstValue_2
# 1: chr17_45630589_C_A_b38 chr17_46031704_46032046 1584;41 891;27 146;5 1584 891 146
# 2: chr17_45630589_C_A_b38 chr17_46032300_46033079 782;41 438;27 76;5 782 438 76
# 3: chr17_45630589_C_A_b38 chr17_46033193_46033402 988;41 620;27 116;5 988 620 116
# 4: chr17_45630589_C_A_b38 chr17_46033461_46034160 1162;41 725;27 133;5 1162 725 133
# 5: chr17_45630589_C_A_b38 chr17_46033470_46034160 0;41 0;27 0;5 0 0 0
# 6: chr17_45630589_C_A_b38 chr17_46034280_46038537 5;41 4;27 0;5 5 4 0

# now filter
dt[ firstValue_0 == 0 & firstValue_0 > 1 & firstValue_2 > 1, ]

注意:根据您的示例数据,没有符合此条件的行。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com