Извлечь минимальную и максимальную дату, используя dplyr - PullRequest
0 голосов
/ 11 марта 2019

После объединения 4 фреймов данных с минимальными и максимальными датами для каждой подгруппы (a, b, c, d и т. Д.) Итоговый фрейм данных имеет следующие столбцы:

Id   a_min_date_df1  a_max_date_df1  a_min_date_df2   a_max_date_df2  a_min_date_df3    a_max_date_df3  a_min_date_df4   a_max_date_df4
1    2014-01-01      2014-01-10       NA              NA               NA                NA             2014-02-20       2014-05-01
2    2014-02-01      2014-02-10       NA              NA               2015-02-20       2015-03-01             NA               NA

Для некоторого идентификатораУ меня есть только минимальные и максимальные даты, доступные из 1 из 2 фреймов данных вместо всех 4 фреймов данных.

Я хочу добавить:

  • новый столбец с минимальной датой столбцов минимальной даты для каждой подгруппы (a, b, c, d и т. Д.)..)

  • новый столбец с максимальной датой столбцов max-date для каждой подгруппы (a, b, c, d и т. Д.)

  • столбец, который вычисляет разницу между новой максимальной и минимальной датой, и, если разница превышает 365 дней, я хочу настроить новую минимальную и максимальную дату и заменить их первоначальными датами: a_min_date_df1 и a_max_date_df1

Я попробовал это, и это работает, но у df есть более 500 подгрупп, которые я не мог сделать вручную для каждой.

mutate(df, a_min= pmin(a_min_date1_df1, a_min_date1_df2, a_min_date1_df3, a_min_date1_df4, na.rm=TRUE), 
a_max= pmax(a_max_date1_df1, a_max_date1_df2, a_max_date1_df3, a_max_date1_df4, na.rm=TRUE)

Я начал заменять имена столбцов на mutate (df, a_min = pmin (setdiff (sets_with ("a_"), заканчивается_with (min_date), na.rm = TRUE), a_max = pmax (setdiff (start_with ("a_"), заканчивается_with (min_date), na.rm = TRUE)) Это не сработало для меня. Все предложения welecom.

1 Ответ

0 голосов
/ 11 марта 2019

Можно попробовать:

library(dplyr)

df %>%
  mutate_at(vars(-Id), list(~ as.Date(as.character(.)))) %>%
  mutate(pmx = pmax(!!! syms(select(., contains("max")) %>% names), na.rm = T),
         pmn = pmin(!!! syms(select(., contains("min")) %>% names), na.rm = T),
         diffr = pmx - pmn,
         pmx = case_when(diffr > 365 ~ a_max_date_df1, TRUE ~ pmx),
         pmn = case_when(diffr > 365 ~ a_min_date_df1, TRUE ~ pmn)
  )

Выход:

  Id a_min_date_df1 a_max_date_df1 a_min_date_df2 a_max_date_df2 a_min_date_df3 a_max_date_df3 a_min_date_df4
1  1     2014-01-01     2014-01-10           <NA>           <NA>           <NA>           <NA>     2014-02-20
2  2     2014-02-01     2014-02-10           <NA>           <NA>     2015-02-20     2015-03-01           <NA>
  a_max_date_df4        pmx        pmn    diffr
1     2014-05-01 2014-05-01 2014-01-01 120 days
2           <NA> 2014-02-10 2014-02-01 393 days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...