Выберите все строки, принадлежащие к группам, которые удовлетворяют нескольким условиям - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть данные панели со следующей структурой:

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 - да.

Мне нужно найти идентификатор, у которого постоянно было действие = 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  

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Подход базового R с использованием ave, где мы проверяем, все ли числа после первого появления 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
0 голосов
/ 10 сентября 2018

Вы можете сделать что-то вроде:

library(dplyr)

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

Это newDF включает только ID s, где (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...