Как я могу сохранить только те строки, которые вместе содержат самый длинный последовательный запуск переменной, увеличивающейся на единицу, используя dplyr в R? - PullRequest
2 голосов
/ 20 июня 2020

У меня есть таблица, где каждая строка содержит идентификатор темы и год. Моя цель - выделить для каждого предмета только те строки, которые вместе составляют самую длинную последовательность строк, в которой переменная year увеличивается на 1 от одной строки к другой.

Я пробовал довольно много несколько вещей с сгруппированным фильтром, например создание вспомогательных переменных, которые кодируют, является ли год в одной строке на один больше или меньше года в предыдущей строке, и использование функции rle (). Но пока ничего не работает так, как должно.

Вот игрушечный пример моих данных. Обратите внимание, что количество строк различается по предметам и что обычно (некоторые) промежутки между годами есть. Также обратите внимание, что данные организованы таким образом, что значение года всегда увеличивается от одной строки к другой в пределах каждой темы. 1010 *

Чтобы уточнить, для этого фрагмента желаемый результат:

# A tibble: 3 x 2
  subject  year
    <dbl> <dbl>
1       1  2015
2       1  2016
3       1  2017

(Обратите внимание, что субъект 2 отбрасывается, потому что у него нет последовательности лет, увеличивающейся на единицу.)

Должен быть элегантный способ сделать это с помощью dplyr!

1 Ответ

1 голос
/ 20 июня 2020

Это не учитывает ничьи, но ...

dat %>%
  group_by(subject) %>%
  mutate( r = cumsum(c(TRUE, diff(year) != 1)) ) %>%
  group_by(subject, r) %>%
  mutate( rcount = n() ) %>%
  group_by(subject) %>%
  filter(rcount > 1, rcount == max(rcount)) %>%
  select(-r, -rcount) %>%
  ungroup()
# # A tibble: 3 x 2
#   subject  year
#     <dbl> <dbl>
# 1       1  2015
# 2       1  2016
# 3       1  2017
...