选择所有符合多个条件的组的行

时间:2018-09-10 02:22:50

标签: r

我有一个具有以下结构的面板数据:

ID  Month  Action
1    1       0
1    2       0
1    3       1
1    4       1
2    1       0
2    2       1
2    3       0
2    4       1
3    1       0
3    2       0
3    3       0
4    1       0
4    2       1
4    3       1
4    4       0

每个ID每个月都有一行,操作会指示此ID在本月是否执行过此操作,0为否,1为是。

一旦他们开始执行操作,我需要找到连续具有action = 1的ID(开始于哪个月无关紧要,但是一旦开始,在接下来的几个月中,操作应始终为1)。我也希望将属于这些ID的所有行记录在一个新的数据框中。

如何在R中做到这一点?

在我的示例中,自第3个月以来,ID = 1始终具有action = 1,因此我要查找的最终数据框应仅具有属于ID = 1的行。

ID  Month  Action  
 1      1       0  
 1      2       0  
 1      3       1  
 1      4       1  

2 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

library(dplyr)

df %>% 
  group_by(ID) %>%
  filter(all(diff(Action)>=0) & max(Action)>0) -> newDF

newDF仅包括ID,其中(a)动作永不减少(即,没有1 => 0) (b)在至少一个Action==1

     ID Month Action
  <int> <int>  <int>
1     1     1      0
2     1     2      0
3     1     3      1
4     1     4      1

答案 1 :(得分:2)

使用ave的基本R方法,我们检查第一次出现1之后的所有数字是否全部为1。添加any条件是删除所有0的小肠。

df[with(df, as.logical(ave(Action, ID, FUN = function(x) {
       inds = cumsum(x)
       any(inds > 0)  & all(x[inds > 0] == 1) 
}))), ]

#  ID Month Action
#1  1     1      0
#2  1     2      0
#3  1     3      1
#4  1     4      1

或者具有相同逻辑但又有一点简洁的另一个选择是

df[with(df, ave(Action == 1, ID, FUN = function(x) 
   all(x[which.max(x):length(x)] == 1)
)), ]


#  ID Month Action
#1  1     1      0
#2  1     2      0
#3  1     3      1
#4  1     4      1