gpt4 book ai didi

r - 删除*所有*重复的行,除非有 “similar”行

转载 作者:行者123 更新时间:2023-12-04 13:36:09 26 4
gpt4 key购买 nike

我有以下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

我想研究给定 V2V1的不同值。但是,如果给定 V2V1的所有值都相同,那我就不会感兴趣,因此我想删除这样的行。

在上面的示例中,前三行完全相同( V1=1V2=4),因此我希望将其删除。

但是,接下来的四行包括两行相同的行,其他行具有不同的 V2。在这种情况下,我想显示给定 V2V1 = 2的三个可能值: (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

(显示每个“有趣的” V2V1可能的值)

我无法弄清楚如何区分 (1,4)大小写(所有行都是相同的)和 (2,5)大小写(存在一些重复,但是还有其他行具有相同的 V1,因此我们必须删除重复的 (2,5),但保留一个副本)。

至于唯一行,我写了一个非常丑陋的电话,但只有在唯一行的情况下,它才有效。如果有两个,例如上面的示例,它将失败。

最佳答案

一种选择是按“V1”进行分组,获得唯一元素长度大于1的分组的索引,然后采用unique

unique(dt[dt[, .(i1 = .I[uniqueN(V2) > 1]), V1]$i1])
# V1 V2
#1: 2 5
#2: 2 6
#3: 2 7

或正如@ r2evans所提到的
unique(dt[, .SD[(uniqueN(V2) > 1)], by = "V1"])

注意:OP的数据集是 data.table,而 data.table方法是自然的方法

如果需要 tidyverse选项,则可以与上述 data.table选项进行比较
library(dplyr)
dt %>%
group_by(V1) %>%
filter(n_distinct(V2) > 1) %>%
distinct()

关于r - 删除*所有*重复的行,除非有 “similar”行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com