繁体   English   中英

提取所有列组中共有的元素

[英]Extract elements common in all column groups

我有一个R数据集x,如下所示:

  ID Month
1   1   Jan
2   3   Jan
3   4   Jan
4   6   Jan
5   6   Jan
6   9   Jan
7   2   Feb
8   4   Feb
9   6   Feb
10  8   Feb
11  9   Feb
12 10   Feb
13  1   Mar
14  3   Mar
15  4   Mar
16  6   Mar
17  7   Mar
18  9   Mar
19  2   Apr
20  4   Apr
21  6   Apr
22  7   Apr
23  8   Apr
24 10   Apr
25  1   May
26  2   May
27  4   May
28  6   May
29  7   May
30  8   May
31  2   Jun
32  4   Jun
33  5   Jun
34  6   Jun
35  9   Jun
36 10   Jun

我试图找出一个R函数/代码来识别每个月至少存在一次的所有ID。 在上述情况下,所有月份都有ID 46

谢谢

首先,拆分df$ID通过Month和使用intersect找到共同要素的每个子小组。

Reduce(intersect, split(df$ID, df$Month))
#[1] 4 6

如果要子集相应的data.frame,请执行

df[df$ID %in% Reduce(intersect, split(df$ID, df$Month)),]

我们可以使用data.table 将'data.frame'转换为'data.table'( setDT(df1) ),按'ID'分组,获取行索引( .I ),其中唯一的'Month'数等于唯一的'整个数据集中的月数,并基于此

library(data.table)
setDT(df1)[df1[, .I[uniqueN(Month) == uniqueN(df1$Month)], ID]$V1]
#    ID Month
# 1:  4   Jan
# 2:  4   Feb
# 3:  4   Mar
# 4:  4   Apr
# 5:  4   May
# 6:  4   Jun
# 7:  6   Jan
# 8:  6   Jan
# 9:  6   Feb
#10:  6   Mar
#11:  6   Apr
#12:  6   May
#13:  6   Jun

提取“ ID”

setDT(df1)[, ID[uniqueN(Month) == uniqueN(df1$Month)], ID]$V1
#[1] 4 6

或与base R

1)tablerowSums一起rowSums

v1 <- rowSums(table(df1) > 0)
names(v1)[v1==max(v1)]
#[1] "4" "6"

此信息可用于子集数据

subset(df1, ID %in% names(v1)[v1 == max(v1)])

2)使用tapply

lst <- with(df1, tapply(Month, ID, FUN = unique))
names(which(lengths(lst) == length(unique(df1$Month))))
#[1] "4" "6"

或使用dplyr

library(dplyr)
df1 %>%
     group_by(ID) %>%
     filter(n_distinct(Month)== n_distinct(df1$Month)) %>%
     .$ID %>%
     unique
#[1] 4 6

或者如果我们需要获取行

df1 %>%
     group_by(ID) %>%
     filter(n_distinct(Month)== n_distinct(df1$Month))
# A tibble: 13 x 2
# Groups:   ID [2]
#      ID Month
#   <int> <chr>
# 1     4   Jan
# 2     6   Jan
# 3     6   Jan
# 4     4   Feb
# 5     6   Feb
# 6     4   Mar
# 7     6   Mar
# 8     4   Apr
# 9     6   Apr
#10     4   May
#11     6   May
#12     4   Jun
#13     6   Jun

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM