查找具有分组变量的重复项
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
的预期结果是:1
和 4
。因为它们存在于地铁和火车群中。
提前致谢!
我们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
部分分组,pull
ing 在 j
部分。
library(data.table)
library(magrittr)
setDT(df1)
melt(df1, 'group') %>%
.[, .(n = uniqueN(group)), value] %>%
.[n > 1, unique(value)]
# [1] 1 4
我有一个看起来像这样的 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
的预期结果是:1
和 4
。因为它们存在于地铁和火车群中。
提前致谢!
我们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
部分分组,pull
ing 在 j
部分。
library(data.table)
library(magrittr)
setDT(df1)
melt(df1, 'group') %>%
.[, .(n = uniqueN(group)), value] %>%
.[n > 1, unique(value)]
# [1] 1 4