查找具有分组变量的重复项

find duplicates with grouped variables

我有一个看起来像这样的 df:

我猜它会与 dplyr 和副本一起工作。但是我不知道如何在区分分组变量的同时处理多个列。

from  to  group

1     2   metro
2     4   metro
3     4   metro
4     5   train
6     1   train
8     7   train

我想找到存在于多个 group 变量中的 ids

示例 df 的预期结果是:14。因为它们存在于地铁和火车群中。

提前致谢!

我们gather将'from'、'to'列转为'long'格式,按'val'分组,filter分组有多个一个独特的元素,然后 pull 个独特的 'val' 个元素

library(dplyr)
library(tidyr)
df1 %>% 
   gather(key, val, from:to) %>% 
   group_by(val) %>% 
   filter(n_distinct(group) > 1) %>%
   distinct(val) %>%
   pull(val)
#[1] 1 4

或者使用 base R 我们可以 table 找到频率,并从中获取 ID

out <-  with(df1, colSums(table(rep(group, 2), unlist(df1[1:2])) > 0)) > 1
names(which(out))
#[1] "1" "4"

数据

df1 <- structure(list(from = c(1L, 2L, 3L, 4L, 6L, 8L), to = c(2L, 4L, 
 4L, 5L, 1L, 7L), group = c("metro", "metro", "metro", "train", 
 "train", "train")), class = "data.frame", row.names = c(NA, -6L
 ))

使用基数 R 我们可以 split 基于 group 的前两列,并使用 intersect

找到组之间的相交值
Reduce(intersect, split(unlist(df[1:2]), df$group))
#[1] 1 4

使用 data.table 将数据转换为长格式并计算唯一值。 melt用于转long格式,数据table允许在i部分过滤df1[ i, j, k],在k部分分组,pulling 在 j 部分。

library(data.table)
library(magrittr)
setDT(df1)

melt(df1, 'group') %>% 
  .[, .(n = uniqueN(group)), value] %>% 
  .[n > 1, unique(value)]

# [1] 1 4