【发布时间】:2019-10-10 11:42:13
【问题描述】:
我有以下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
我想研究给定V1 的V2 的不同值。但是,如果给定 V1 的所有 V2 值都相同,那我就不感兴趣了,所以我想删除这些行。
看上面的例子,前三行完全相同(V1=1、V2=4),所以我想删除它们。
但是,接下来的四行包括两个相同的行和其他带有不同 V2 的行。在这种情况下,我想显示给定V1 = 2 的V2 的三个可能值:(2, 5)、(2, 6) 和(2, 7)。
最后两行有唯一的V1: 属于“所有行完全相同”的类别,因此也应删除。
我能想到的最好的显示在this answer:
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) 和 (4,5) 对,因为它们是唯一的,因此不会被 duplicated() 标记标记.
另一种选择是简单地调用
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
(显示每个“有趣”V1 的V2 的可能值)
我不知道如何区分 (1,4) 案例(所有行都相同)和 (2,5) 案例(有一些重复,但还有其他行具有相同的 V1,所以我们必须删除重复的(2,5),但保留一份)。
至于唯一行,我写了一个非常丑陋的调用,但它只有在只有一个唯一行时才有效。如果有两个,如上例,则失败。
【问题讨论】:
-
你的预期输出是什么
-
@akrun 预期的输出在最后两个代码块中给出。
标签: r data.table