我有一个数据框,有很多列和行,有很多ids,下面的数据只显示2个ids。
id treatment
1 A
1 B
1 C
1 D
1 E
2 A
2 B
2 C
我想得到具有五个处理(A,B,C,D,E)的id的子组。因此,输出表将如下所示:
id treatment
1 A
1 B
1 C
1 D
1 E
非常感谢。
发布于 2019-05-19 22:41:20
这里有一个非常简洁的方法:
head(my.data)
id treatment
1 1 A
2 1 B
3 1 C
4 1 D
5 1 E
6 2 A
group_by(my.data, id) %>% filter(n_distinct(treatment) == 5)
# A tibble: 5 x 2
# Groups: id [1]
id treatment
<int> <chr>
1 1 A
2 1 B
3 1 C
4 1 D
5 1 E
解释
在内部,n_distinct(treatment)
会统计每个id
类别中唯一值的实例,因为您是按该列分组的。则filter保留出现5次的id
。
发布于 2019-05-19 23:03:28
要返回包含所有处理的ID组的子集,请执行类似以下操作:
install.packages("dplyr")
library(dplyr)
treatments <- c("A", "B", "C", "D", "E")
df %>% group_by(id) %>% filter(all(treatments %in% treatment))
#### OUTPUT ####
# A tibble: 5 x 2
# Groups: id [1]
id treatment
<int> <fct>
1 1 A
2 1 B
3 1 C
4 1 D
5 1 E
这里的主要优点是它正确地处理了重复的条件。也就是说,在一个ID组中有相同条件的可能性很小,例如:
# A tibble: 11 x 2
id treatment
<dbl> <chr>
1 1 A
2 1 A
3 1 B
4 1 C
5 1 D
6 1 E
7 2 A
8 2 A
9 2 B
10 2 B
11 2 C
上面的代码将返回包含每个条件的任何组的所有观察结果:
# A tibble: 6 x 2
# Groups: id [1]
id treatment
<dbl> <chr>
1 1 A
2 1 A
3 1 B
4 1 C
5 1 D
6 1 E
发布于 2019-05-19 23:03:53
还有一种dplyr
可能性:
df %>%
group_by(id) %>%
filter(grepl("A,B,C,D,E", paste(treatment, collapse = ","), fixed = TRUE))
id treatment
<int> <chr>
1 1 A
2 1 B
3 1 C
4 1 D
5 1 E
在这里,它还考虑了排序,这意味着它过滤掉了治疗不进行A,B,C,D,E
的情况。
如果顺序不重要,则可以先排列"treatment“列:
df %>%
group_by(id) %>%
arrange(treatment, .by_group = TRUE) %>%
filter(grepl("A,B,C,D,E", paste(treatment, collapse = ","), fixed = TRUE))
考虑@gersht展示的一个场景,可以将其修改为:
df %>%
group_by(id) %>%
filter(grepl("A,B,C,D,E", paste(unique(treatment), collapse = ","), fixed = TRUE))
或者:
df %>%
group_by(id) %>%
arrange(treatment, .by_group = TRUE) %>%
filter(grepl("A,B,C,D,E", paste(unique(treatment), collapse = ","), fixed = TRUE))
https://stackoverflow.com/questions/56208811
复制相似问题