我有一个具有以下结构的面板数据:
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
答案 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