根据其他行的值过滤数据框的某些行
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) 如果 l2
和 var4
的条件可以在不同的行中得到满足就可以了:
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) 如果 l2
和 var4
的条件必须在同一行中满足(可能会简化一点,但为了说明的目的,我在这里更详细一点) :
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
我想根据其他行的值过滤数据框的某些行,但我不知道如何进行。下面是我想做的一个例子。
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) 如果 l2
和 var4
的条件可以在不同的行中得到满足就可以了:
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) 如果 l2
和 var4
的条件必须在同一行中满足(可能会简化一点,但为了说明的目的,我在这里更详细一点) :
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