首页 > 解决方案 > 过滤重复的行序列

问题描述

(请注意,我很惊讶没有找到类似的问题,但如果我弄错了,我很乐意删除这个问题)。

我有以下示例数据集。

library(data.table)
dt <- data.table(val = c(1, 2, 3, 0, 2, 4, 1, 2, 3), id = c(1, 1, 1, 2, 2, 2, 3, 3, 3))

id=1 的组与 id=3 的组具有相同的 val (1,2,3) 值。我想过滤掉组 id=3 中的这个“重复”值。

我想要的输出是:

> dt
   val id
1:   1  1
2:   2  1
3:   3  1
4:   0  2
5:   2  2
6:   4  2

我只是想出了一些肮脏的解决方法,比如取 sum:dt[, filter:= sum(val) , by = id]并删除重复项,但是 id = 2 的值也会消失。

注意:如果 id=3 的值为 1,3,2(因此值相同但顺序不同,则不应删除行),..所以顺序很重要。

标签: rdata.table

解决方案


这不是特定于 data.table 的方法,但它会起作用:

x = split(dt$val, dt$id)
dt[!id %in% names(x[duplicated(x)])]
#   val id
#1:   1  1
#2:   2  1
#3:   3  1
#4:   0  2
#5:   2  2
#6:   4  2

就效率而言,它可能不是最佳的。


推荐阅读