当一个变量周期内的所有数字均等于NA时,删除行

时间:2018-08-14 07:42:46

标签: 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(对于第11到15行,x等于x,则y与NA相等)。我不会删除其他行,因为当x从1移到5时,存在至少一个y而不是NA(就像从第6行到10一样,当x为5时y是7,因此我保留第6到10行) 。我想知道如何编写R代码来实现这一目标。

1 个答案:

答案 0 :(得分:1)

使用基数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

使用tidyverse:

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

您当然可以取消选择,然后删除m