dat <- data.frame(id = c(1,1,1,2,2,2,3,3,3,3,3,3,4,4,4,4,4, 5, 5,6,6,6,7,7,7),
a = c(1,2,2,1,1,2,1,1,1,2,2,2,1,1,1,1,2, 1,2,2,2,2,1,1,1))
View(dat1)
所需输出:id a
2 1
2 1
2 2
3 1
3 1
3 1
3 2
3 2
3 2
4 1
4 1
4 1
4 1
4 2
我尝试了以下代码:
library(dplyr)
dat1 <- dat %>% group_by(id) %>%
filter(n() > 2) %>%
filter(any(a!= 2)) %>% filter(any(a != 1)) %>% filter(a == 1 | (cumsum(a == 2) == 1))
但是组id=1必须删除,因为只有一行与a==1价值。我需要至少2行a==1
您可以使用n_distinct
来获得唯一值的计数,使用sum
来计算每个id
中a = 1
的出现次数。
使用dplyr
,你可以做-
library(dplyr)
dat %>%
group_by(id) %>%
filter(n_distinct(a) >=2 && sum(a == 1) >= 2) %>%
ungroup
# id a
# <dbl> <dbl>
# 1 2 1
# 2 2 1
# 3 2 2
# 4 3 1
# 5 3 1
# 6 3 1
# 7 3 2
# 8 3 2
# 9 3 2
#10 4 1
#11 4 1
#12 4 1
#13 4 1
#14 4 2
也可以写成R和data.table
。
#Base R
subset(dat, as.logical(ave(a, id,
FUN = function(x) length(unique(x)) >= 2 && sum(x == 1) >= 2)))
#data.table
library(data.table)
setDT(dat)[, .SD[uniqueN(a) >=2 && sum(a == 1) >= 2], id]