r语言 - 在组id中至少有两行具有特定值的过滤器,并且在列a中至少有两个不同的值

  • 本文关键字:两个 id 在组 r语言 两行 过滤器 r dplyr
  • 更新时间 :
  • 英文 :

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来计算每个ida = 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]

最新更新