【问题标题】:Choose one in a duplicate/triplicate set conditionally in R data frame在 R 数据框中有条件地在重复/一式三份集中选择一个
【发布时间】:2016-02-24 14:17:05
【问题描述】:

我有一个大约有一个数据框。 500k 行(遗传标记)。一些标记具有相同的 CHR 和 STOP 值(重复/三次),但所有行都有唯一的 SNP 字段。我想识别重复标记(基于 CHR 和 STOP 字段),然后选择具有最低 F_MISS 值(最后一个字段)的标记(通过 SNP)。我通过多次循环数据框使其工作(识别重复项-> 子集-> 按 F_MISS 排序后报告第一行),但这非常耗时。我正在寻找一种更快的方法来实现同样的目标。下面的示例(由于 F_MISS 较低,请参阅 rs53565463 应优先于 1KG_10_12259383 的重复项的两条底线)。请注意,列表中也有一些一式三份。

SNP               CHR  START  STOP    F_MISS
1KG_10_101715768  4      0 101715769  0.000e+00
1KG_10_102584498  5      0 102584499  4.967e-05
1KG_10_105796247  6      0 105796248  0.000e+00
1KG_10_1066786    2      0   1066787  9.935e-05
1KG_10_115662307  3      0 115662308  0.000e+00
1KG_10_12259383   10     0  12259384  7.100e-02
rs53565463        10     0  12259384  4.967e-05
...

编辑:

根据要求,预期输出是(注意输出缺少第 1KG_10_12259383 行,因为 F_MISS 较低,首选 rs53565463):

SNP               CHR  START  STOP    F_MISS
1KG_10_101715768  4      0 101715769  0.000e+00
1KG_10_102584498  5      0 102584499  4.967e-05
1KG_10_105796247  6      0 105796248  0.000e+00
1KG_10_1066786    2      0   1066787  9.935e-05
1KG_10_115662307  3      0 115662308  0.000e+00
rs53565463        10     0  12259384  4.967e-05
...

【问题讨论】:

  • 你能发布你现有的循环吗?
  • 请添加此示例的预期输出

标签: r dataframe duplicates


【解决方案1】:

假设你的数据框是test:

test <- test[order(test$CHR,test$STOP,test$F_MISS),]
test <- test[!duplicated(test[c("CHR","STOP")]),]

第一部分对数据帧进行排序,使得每组 CHR 和 STOP 的第一条记录将是最低的 F_MISS 值。接下来删除与第一次遇到的 CHR 和 STOP 组合重复的所有行。

这其中耗费大量时间的可能是订购。如果您发现速度是个问题,您可以考虑使用data.table 包来处理数据。

【讨论】:

  • 谢谢,这既快又按预期工作。即使没有 data.table,排序也只需几秒钟。
【解决方案2】:

使用dplyr 假设您的数据在df

res <- df %>% arrange(F_MISS) %>% filter(!duplicated(CHR, STOP))

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多