Функция R для определения местоположения интервала даты и возврата указанного c значения? - PullRequest
1 голос
/ 14 января 2020

Я новичок в R, и это мой первый вопрос о переполнении стека!

У меня есть следующие фреймы данных, и я хотел бы создать функцию, которая принимает "DocDate" из tbl_1, определяет, какой интервал из tbl_2 он попадает внутрь и присваивает значение «Period_Ending» из tbl_2 в новом столбце.

library(tidyverse)
library(lubridate)


tbl_1 <- data.frame(DocDate = as.Date(c("2017-01-03", "2017-02-07", "2017-03-04")),
                    State1 = c("RI", "CT", "GA"),
                    MD = c(78, 115, 127),
                    OD = c(150, 220, 235))

tbl_1
  DocDate    State1  MD  OD
1 2017-01-03     RI  78 150
2 2017-02-07     CT 115 220
3 2017-03-04     GA 127 235



tbl_2 <- data.frame(begin = as.Date(c("2017-01-01", "2017-01-29", "2017-02-26")),
                    Period_Ending = as.Date(c("2017-01-29", "2017-02-26", "2017-03-26")))

tbl_2 <- tbl_2 %>% 
    mutate(date_interval = as.interval(x = weeks(4), start = (tbl_2$Period_Ending)))

tbl_2
        begin Period_Ending  date_interval
1 2017-01-01    2017-01-29   2017-01-29 UTC--2017-02-26 UTC
2 2017-01-29    2017-02-26   2017-02-26 UTC--2017-03-26 UTC
3 2017-02-26    2017-03-26   2017-03-26 UTC--2017-04-23 UTC

Желаемый результат - таблица, которая выглядит следующим образом:

 DocDate       State1  MD  OD    Period_Ending
1 2017-01-03     RI    78  150    2017-01-29
2 2017-02-07     CT   115  220    2017-02-26
3 2017-03-04     GA   127  235    2017-03-26

У меня есть возможность сделать это вручную, используя выражения case_when, подобные этому

mutate(Period_Ending = case_when(
    (DocDate > ymd("2017-01-01")) & (DocDate < ymd("2017-01-29")) ~ ymd("2017-01-29"),
    (DocDate > ymd("2017-01-29")) & (DocDate < ymd("2017-02-26")) ~ ymd("2017-02-26"),
    (DocDate > ymd("2017-02-26")) & (DocDate < ymd("2017-03-26")) ~ ymd("2017-03-26")

, но я надеюсь найти автоматизированное решение и буду очень признателен за любую помощь, которую вы можете предложить!

1 Ответ

0 голосов
/ 14 января 2020
library(tidyverse)

# example data
tbl_1 <- data.frame(DocDate = as.Date(c("2017-01-03", "2017-02-07", "2017-03-04")),
                    State1 = c("RI", "CT", "GA"),
                    MD = c(78, 115, 127),
                    OD = c(150, 220, 235))

tbl_2 <- data.frame(begin = as.Date(c("2017-01-01", "2017-01-29", "2017-02-26")),
                    Period_Ending = as.Date(c("2017-01-29", "2017-02-26", "2017-03-26")))


tbl_2 %>%
  mutate(date = map2(begin, Period_Ending , ~seq(.x, .y, "day"))) %>%  # create a sequence of dates (begin to end)
  unnest(date) %>%                                                     # save it as column
  inner_join(tbl_1, by=c("date" = "DocDate")) %>%                      # join the other dataset
  select(DocDate = date, State1, MD, OD, Period_Ending)                # re-ararnge columns


# # A tibble: 3 x 5
#   DocDate    State1    MD    OD Period_Ending
#   <date>     <fct>  <dbl> <dbl> <date>       
# 1 2017-01-03 RI        78   150 2017-01-29   
# 2 2017-02-07 CT       115   220 2017-02-26   
# 3 2017-03-04 GA       127   235 2017-03-26 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...