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