我有以下内容data.table
:
library(data.table)
dt = data.table(c(1, 1, 1, 2, 2, 2, 2, 3, 4),
c(4, 4, 4, 5, 5, 6, 7, 4, 5))
V1 V2
1: 1 4
2: 1 4
3: 1 4
4: 2 5
5: 2 5
6: 2 6
7: 2 7
8: 3 4
9: 4 5
我想研究不同的价值观V2
对于给定的V1
。但是,如果所有值V2
对于给定的V1
是相同的,我对此不感兴趣,所以我想删除这些行。
查看上面的示例,前三行完全相同(V1=1
, V2=4
),所以我想删除它们。
然而,接下来的四行包括两个相同的行和其他具有不同的行V2
。在这种情况下,我想显示三个可能的值V2
given V1 = 2
: (2, 5)
, (2, 6)
and (2, 7)
.
最后两行有唯一的V1
:属于“所有行都完全相同”的类别,因此也应该删除。
我能想到的最好的显示在这个答案 https://stackoverflow.com/a/7854620/2175231:
dt[!duplicated(dt) & !duplicated(dt, fromLast = TRUE), ]
V1 V2
1: 2 6
2: 2 7
3: 3 4
4: 4 5
这显然不能令人满意:它删除了(2,5)
对,因为它是重复的,并且它保留了(3,4)
and (4,5)
成对,因为它们是唯一的,因此不会被任何一个标记duplicated()
pass.
另一种选择就是简单地调用
unique(dt)
V1 V2
1: 1 4
2: 2 5
3: 2 6
4: 2 7
5: 3 4
6: 4 5
但它保留了(1,4)
, (3,4)
, (4,5)
我想要删除的对。
最后,我想要的结果是:
V1 V2
1: 2 5
2: 2 6
3: 2 7
尽管任何其他格式也是可以接受的,例如:
V1 V2.1 V2.2 V2.3
1: 2 5 6 7
(这显示了可能的值V2
对于每一个“有趣的”V1
)
我不知道如何区分(1,4)
案例(所有行都相同)(2,5)
案例(有一些重复,但还有其他行具有相同的V1
,所以我们必须删除重复的(2,5)
但保留一份)。
至于唯一行,我编写了一个非常丑陋的调用,但它仅在只有一个唯一行时才有效。如果有两个,例如上面的示例,则会失败。