根据其他行的值过滤数据框的某些行

filter some rows of a data frame depending values of others rows

我想根据其他行的值过滤数据框的某些行,但我不知道如何进行。下面是我想做的一个例子。

data=data.frame(ID=c("ID1",NA, NA, "ID2", NA, "ID3", NA, NA), 
                l2=c(NA,9,4,NA,5,NA,6,8), 
                var3=c("aa", NA, NA, "bc",NA, "cc", NA, NA), 
                var4=c(NA,"yes","no",NA,"yes",NA,"yes","no"))


> data
    ID l2 var3 var4
1  ID1 NA   aa <NA>
2 <NA>  9 <NA>  yes
3 <NA>  4 <NA>  no
4  ID2 NA   bc <NA>
5 <NA>  5 <NA>  yes
6  ID3 NA   cc <NA>
7 <NA>  6 <NA>  yes
8 <NA>  8 <NA>  no

在这个数据框上,我想 select 如果跟随这个 ID 的行(直到下一个)有至少一个值 < 7 的 l2 变量和一个“是” " 对于 var4 变量。 遵循这条规则,我希望得到以下输出。 这只是一个例子,我有更多的行和更多的其他变量。 如果有人有 dplyr 的解决方案,那将是完美的。

> outpout=data.frame(ID=c("ID2","ID3"), l2=c(NA,NA), var3=c( "bc","cc"), var4=c(NA,NA))

> outpout
   ID l2 var3 var4
1 ID2 NA   bc   NA
2 ID3 NA   cc   NA

你可以这样做:

a) 如果 l2var4 的条件可以在不同的行中得到满足就可以了:

library(tidyverse)
data %>%
  fill(ID) %>%
  group_by(ID) %>%
  filter((any(l2 < 7) & any(var4 == "yes")) & row_number() == 1) %>%
  ungroup()

# A tibble: 3 x 4
  ID       l2 var3  var4 
  <chr> <dbl> <chr> <chr>
1 ID1      NA aa    NA   
2 ID2      NA bc    NA   
3 ID3      NA cc    NA   

b) 如果 l2var4 的条件必须在同一行中满足(可能会简化一点,但为了说明的目的,我在这里更详细一点) :

data %>%
  fill(ID) %>%
  group_by(ID) %>%
  filter((l2 < 7 & var4 == "yes") | row_number() == 1) %>%
  filter(n() > 1 & row_number() == 1) %>%
  ungroup()

# A tibble: 2 x 4
  ID       l2 var3  var4 
  <chr> <dbl> <chr> <chr>
1 ID2      NA bc    NA   
2 ID3      NA cc    NA