У меня есть данные панели со следующей структурой:
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
где каждый идентификатор имеет одну строку для каждого месяца, действие указывает, выполнил ли этот идентификатор это действие в этом месяце или нет, 0 - нет, 1 - да.
Мне нужно найти идентификатор, который постоянно имел action = 1 после того, как они запустили действие (не имеет значения, в каком месяце они были запущены, но после запуска в следующие месяцы действие всегда должно быть 1). Я также хочу записать все строки, принадлежащие этим идентификаторам, в новый фрейм данных.
Как я могу это сделать в R?
В моем примере ID = 1 постоянно имел action = 1 с 3 месяца, поэтому последний фрейм данных, который я ищу, должен содержать только строки, принадлежащие ID = 1.
ID Month Action
1 1 0
1 2 0
1 3 1
1 4 1
Вы можете сделать что-то вроде:
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
Подход с базовым R с использованием ave
, где мы проверяем, все ли числа после первого появления 1 равны 1. Условие any
добавлено для удаления входов со всеми нулями.
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