R: Выберите самую раннюю дату после постоянного изменения статуса (не только самая ранняя дата, зависящая от статуса, но и от постоянного изменения статуса) - PullRequest
1 голос
/ 30 января 2020

У меня есть данные, которые выглядят так:

data <- data.frame(unique_id = c(rep("A",6), rep("B",6)),
               year = c(seq(2010,2015),seq(2010,2015)),
               value = c(100,100,100,0,0,0,100,0,100,100,0,0))

Я хочу это:

output <- data.frame(unique_id = c("A","B"),
                 year = c(2013,2014))

Какой самый эффективный способ сделать это? Я думаю, что использование dplyr по принципу data %>% group_by(unique_id) %>% filter(value==0) %>% summarise(yr_closed = min(year)) будет работать, но это, очевидно, не возвращает желаемый результат, и я не знаю, какие функции использовать для достижения этого.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Для любого, кто ответит на этот вопрос в будущем, лучше всего получится добавить arrange к ответу @ akrun. Я также удалил select с конца:

data %>% group_by(unique_id) %>% arrange(year) %>% slice(which.max(rleid(value)))

Это было лучше для моих реальных данных, потому что я группировал по двум категориям, из-за чего переменная даты вышла из строя (поэтому максимальное значение rleid не всегда последняя дата). Сохранение value также помогло мне, потому что моей конечной целью было пометить наблюдения ненулевыми значениями за последний год как «открытые» и пометить их как «закрытые», если их последнее значение было равно нулю.

0 голосов
/ 30 января 2020

Вот вариант с rleid

library(dplyr)
library(data.table)
data %>%
   group_by(unique_id) %>% 
   slice(which.max(rleid(value))) %>%
   select(-value)
# A tibble: 2 x 2
# Groups:   unique_id [2]
#  unique_id  year
#  <fct>     <int>
#1 A          2013
#2 B          2014
...