【问题标题】:R data.table duplicate rows with a pair of columnsR data.table 带有一对列的重复行
【发布时间】:2018-04-07 05:05:48
【问题描述】:

data.table 非常有用,但我找不到解决以下问题的优雅方法。那里有一些更接近的答案,但没有一个能解决我的问题。 假设下面是 data.table 对象,我想根据基因对(Gene1 和 Gene2)过滤重复行,但两种方式都可以。

     Gene1    Gene2     Ens.ID.1              Ens.ID.2             CORR
1:   FOXA1    MYC       ENSG000000129.13.     ENSG000000129.11     0.9953311
2:   EGFR     CD4       ENSG000000129         ENSG000000129.12     0.9947215
3:   CD4      EGFR      ENSG000000129.12      ENSG000000129.11     0.9940735
4:   EGFR     CD4       ENSG000000129         ENSG000000129.12     0.9947215 

如果 Gene1 和 Gene2 有这样的重复,那么我想得到这个:

     Gene1    Gene2     Ens.ID.1              Ens.ID.2             CORR
1:   FOXA1    MYC       ENSG000000129.13.     ENSG000000129.11     0.9953311
2:   EGFR     CD4       ENSG000000129         ENSG000000129.12     0.9947215

对数百万行进行标准编码非常慢。 在 data.table 中是否有一种优雅而快速的方法?

【问题讨论】:

  • 你见过stackoverflow.com/a/25151395/496803 吗?这似乎正是您想要做的。
  • 只是一个建议,因为我不知道需要多长时间,但也许您可以考虑创建一个新列,连接 GEN1 和 GEN2,然后删除重复项?

标签: r data.table


【解决方案1】:

链接的答案 (https://stackoverflow.com/a/25151395/496803) 几乎是重复的,https://stackoverflow.com/a/25298863/496803 也是如此,但这里再次出现,略有不同:

dt[!duplicated(data.table(pmin(Gene1,Gene2),pmax(Gene1,Gene2)))]

#   Gene1 Gene2          Ens.ID.1         Ens.ID.2      CORR
#1: FOXA1   MYC ENSG000000129.13. ENSG000000129.11 0.9953311
#2:  EGFR   CD4     ENSG000000129 ENSG000000129.12 0.9947215

如果您有 >2 个或多个要删除的键,您最好转换为长文件、排序、回到宽文件,然后再删除。像这样:

dupvars <- c("Gene1","Gene2")
sel <- !duplicated(
  dcast(
      melt(dt[, c(.SD,id=.(.I)), .SDcols=dupvars], id.vars="id")[
          order(id,value), grp := seq_len(.N), by=id],
      id ~ grp
  )[,-1])
dt[sel,]

【讨论】:

  • 如果有人会使用这个答案,请小心并考虑以下更正。虽然,它似乎工作正常;我在另一次分析中遇到了不正确的结果,尽管没有错误。不知何故,Gene1 和 Gene2 的类型似乎是整数,这导致了不正确的统一。我通过强制它们采用 dt$Gene1
  • @entropy 感谢您的评论,这是一个救生员。我和你有同样的问题(虽然不是关于基因组学),如果我的IDs 是数字,那么接受的答案会产生非常奇怪的结果。我必须将它们转换为字符才能使答案正常工作。再次非常感谢。也许@thelatemail 可以在答案正文中添加关于此问题的注释?
  • @thiagoveloso - 我认为这将是浮点错误的问题,即:1非常接近 1 可能会导致重复数据删除的奇怪问题。 duplicated(c(1, 1.000000000000001)) 例如。我真的不明白为什么它会因整数而失败,但是duplicated(c(1L, 1L)) 应该总是有效的。我会考虑我可以添加到答案中以澄清这个问题。
猜你喜欢
  • 2016-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多