我想过滤组 id 在列和 r 中的某些行值上满足的特定条件



我有样本数据,我想过滤id'stype ==N上从未处于sup状态的编号,这意味着在切换类型之前,我只选择具有status == unsup的id,然后选择从N to P切换的编号id。

  • 例如,id==1type==N上从未有过status==sup,所以我需要计算id 1。然后我还想检查这个id是否切换到P。但是id 2没有资格被选中,因为它在type==N上时具有sup状态。

  • id的2、5和id 7将不符合条件,因为它们具有status == sup,而处于状态的N和id 7仅在处于N时处于NA

data <- data.frame(id=c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7),
type=c('N','N','N', 'N', 'P','P','N','N','N', 'I', 'I','N','N','N',
'N', 'N','N','N','N', 'O', 'O','N','N','N', 'O','N','N','N', 'P', 'P', 'N','N','P'), 
status=c(NA,'unsup',NA,'unsup',NA,'sup',NA,NA,'sup',NA,'sup','unsup',NA,'unsup',NA,
'unsup','unsup',NA,'unsup',NA,'sup','sup',NA,NA,'unsup',NA,'unsup','unsup','unsup','sup', NA, NA, 'sup'))

预期输出

1.

id type status
1   1    N   <NA>
2   1    N  unsup
3   1    N   <NA>
4   1    N  unsup
5   1    P   <NA>
6   1    P    sup
7   3    N  unsup
8   3    N   <NA>
9   3    N  unsup
10  3    N   <NA>
11  3    N  unsup
12  4    N  unsup
13  4    N   <NA>
14  4    N  unsup
15  4    O   <NA>
16  4    O    sup
17  6    N   <NA>
18  6    N  unsup
19  6    N  unsup
20  6    P  unsup
21  6    P    sup

其中,id切换为p的是:

id type status
1   1    N   <NA>
2   1    N  unsup
3   1    N   <NA>
4   1    N  unsup
5   1    P   <NA>
6   1    P    sup
7   6    N   <NA>
8   6    N  unsup
9   6    N  unsup
10  6    P  unsup
11  6    P    sup

对于第一种情况,在按"id"、filter分组后,任何不具有status值为"sup"和type值为"N"的"id",以及那些具有status的任何非NA值的id,其中type为"N’

library(dplyr)
data1 <- data %>% 
group_by(id) %>%
filter((!any((status %in% 'sup' & type == 'N'), na.rm = TRUE))& 
any(!is.na(status[type == "N"]))) %>% 
ungroup

-输出

data1
# A tibble: 21 × 3
id type  status
<dbl> <chr> <chr> 
1     1 N     <NA>  
2     1 N     unsup 
3     1 N     <NA>  
4     1 N     unsup 
5     1 P     <NA>  
6     1 P     sup   
7     3 N     unsup 
8     3 N     <NA>  
9     3 N     unsup 
10     3 N     <NA>  
# … with 11 more rows

从子集数据中,我们可以在检查any的情况后再次filter,其中对于每个"id",type的值为"N",下一个值(lead(为"p">

data1 %>% 
group_by(id) %>%
filter(any(type== "N" & lead(type) == "P", na.rm = TRUE)) %>% 
ungroup
# A tibble: 11 × 3
id type  status
<dbl> <chr> <chr> 
1     1 N     <NA>  
2     1 N     unsup 
3     1 N     <NA>  
4     1 N     unsup 
5     1 P     <NA>  
6     1 P     sup   
7     6 N     <NA>  
8     6 N     unsup 
9     6 N     unsup 
10     6 P     unsup 
11     6 P     sup   

最新更新