Как суммировать суммарные наблюдения в одном наборе данных на один идентификатор, которые происходят за интервал времени другого набора данных - PullRequest
1 голос
/ 12 января 2020

У меня есть два набора данных: DF1 - фрейм данных, в котором перечислены главы государств (leader_id) стран (country_code) и интервал их времени в офисе (office_interval). DF2 - фрейм данных, где каждое наблюдение - это событие, которое имеет страну (код страны) и дату, когда оно произошло (дата события).

Воспроизводимые данные:

library(lubridate)

#Leader DF
leader_id <- c("Adam","Bob","Charlie")
country_code <- c(1,1,2)
office_interval <- c(interval(ymd("1900-01-01"), ymd("1905-01-01")), 
                     interval(ymd("1910-01-01"), ymd("1915-01-01")),
                     interval(ymd("1920-01-01"), ymd("1925-01-01")))
DF1 <- data.frame(leader_id, country_code, office_interval)

#Event DF
country_code <- c(1,2,2,1)
event_date <- c(as.Date("1901-01-01"), 
                as.Date("1902-01-01"), 
                as.Date("1921-01-01"),
                as.Date("1901-02-02"))
DF2 <- data.frame(country_code, event_date)

Я хотел бы создать новый столбец, DF1 $ total_events, который суммирует общее количество наблюдений в DF2, которые происходят в пределах одного и того же кода страны и office_interval для каждого лидер в DF1. Это должно выглядеть так:

    leader_id    country_code1          office_interval         total_events
1      Adam             1       1900-01-01 UTC--1905-01-01 UTC       2
2       Bob             1       1910-01-01 UTC--1915-01-01 UTC       0
3     Charlie           2       1920-01-01 UTC--1925-01-01 UTC       1

Я пытался изменить некоторые решения из этого похожего вопроса , однако я не могу заставить что-либо работать с моими данными.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Мы можем сделать left_join на DF1 и DF2 на "country_code" и подсчитать число event_date в пределах office_interval.

library(dplyr)
library(lubridate)

DF1 %>%
  left_join(DF2, by = "country_code") %>%
  group_by(leader_id, country_code, office_interval) %>%
  summarise(total_events = sum(event_date %within% office_interval))

#  leader_id country_code office_interval                total_events
#  <fct>            <dbl> <Interval>                            <int>
#1 Adam                 1 1900-01-01 UTC--1905-01-01 UTC            2
#2 Bob                  1 1900-01-01 UTC--1905-01-01 UTC            0
#3 Charlie              2 1910-01-01 UTC--1915-01-02 UTC            1
0 голосов
/ 12 января 2020

Использование data.table

library(data.table)
library(lubridate)
setDT(DF1)[DF2, on = .(country_code)][, .(total_events = 
   sum(event_date %within% office_interval)), 
           .(leader_id, country_code, new = office_interval)]
...