R 当另一个变量的周期内的所有数字等于NA时,删除行
我的资料如下:R 当另一个变量的周期内的所有数字等于NA时,删除行,r,tidyverse,R,Tidyverse,我的资料如下: Row x y 1 1 2 2 2 3 3 3 4 4 4 3 5 5 NA 6 1 NA 7 2 NA 8 3 NA 9 4 NA 10 5 7 11 1 NA 12 2 NA 13 3 NA 14 4 NA 15 5 NA 我希望删除第11行到第15行,因为对于x的所有循环y都是NA(y euqal到NA,无论x对第11行到第15行取什么值)。我不打算删除其他行,
Row x y
1 1 2
2 2 3
3 3 4
4 4 3
5 5 NA
6 1 NA
7 2 NA
8 3 NA
9 4 NA
10 5 7
11 1 NA
12 2 NA
13 3 NA
14 4 NA
15 5 NA
我希望删除第11行到第15行,因为对于x的所有循环y都是NA(y euqal到NA,无论x对第11行到第15行取什么值)。我不打算删除其他行,因为当x从1移动到5时,至少有一个y不是NA(比如从第6行到第10行,当x是5时,y是7,因此我保留第6行到第10行)。我想知道我应该如何编写一个R代码来实现这一点。使用基数R,并假设x是排列的,所有的都从1开始
subset(df,!ave(is.na(y),cumsum(c(1,diff(x)<0)),FUN=all))
Row x y
1 1 1 2
2 2 2 3
3 3 3 4
4 4 4 3
5 5 5 NA
6 6 1 NA
7 7 2 NA
8 8 3 NA
9 9 4 NA
10 10 5 7
subset(df,!ave(is.na(y),cumsum(c(1,diff(x)%)
组由(m=c(1,差异(x)%
过滤器(!all(is.na(y)))
#一个tibble:10x4
#分组:m[2]
x y m行
1 1 1 2 1
2 2 2 3 1
3 3 3 4 1
4 4 4 3 1
5NA 1
6 1 NA 2
7 2 NA 2
8 3 NA 2
9 4 NA 2
10 10 5 7 2
当然你可以取消选择然后删除
m
@Patrick:你只有15行吗?你一般有多少行?x总是在1到5之间?df%>%groupby(cumsum(c(1,diff(x))<0))%>%过滤器(!all(is.na(y))
是一个选项(这适用于任何大小的循环)@SaurabhChauhan这是一个样本数据,我只有15行。但回答这个问题解决了我真实数据的问题。非常严格和聪明的解决方案超出了我的预期。谢谢。
df%>%
group_by(m = cumsum(c(1,diff(x)<0)))%>%
filter(!all(is.na(y)))
# A tibble: 10 x 4
# Groups: m [2]
Row x y m
<int> <int> <int> <dbl>
1 1 1 2 1
2 2 2 3 1
3 3 3 4 1
4 4 4 3 1
5 5 5 NA 1
6 6 1 NA 2
7 7 2 NA 2
8 8 3 NA 2
9 9 4 NA 2
10 10 5 7 2