首页 > 解决方案 > 按 ID 和日期合并和平均 R 中的数据

问题描述

我有两个数据集,我想以一种不寻常的方式合并在一起。一个数据集是我的主集,其中包含一个标识符和一个与之相关的日期时间ID。AnID可以出现多次,并附有不同的日期:

> head(Master_Data)
# A tibble: 5 x 2
  ID    Date               
  <chr> <dttm>             
1 a     2018-03-31 00:00:00
2 a     2018-02-28 00:00:00
3 b     2018-06-07 00:00:00
4 c     2018-01-31 00:00:00
5 b     2018-02-09 00:00:00

另一个数据集具有相同ID的、不同的日期以及与该日期相关联的分数ID。ID 也可以在此数据集中多次出现,并且具有不同的日期和分数:

> head(Score_Data)
# A tibble: 6 x 3
  ID    Date                   Score
  <chr> <dttm>                 <dbl>
1 a     2018-01-19 00:00:00     3
2 a     2018-01-01 00:00:00     5
3 a     2018-03-05 00:00:00     7
4 b     2018-01-31 00:00:00     1
5 b     2018-08-09 00:00:00     5
6 c     2018-01-17 00:00:00    10

我想要做的是添加一个额外的列Master_Data,给出dfID中分数的平均值。Score_Data棘手的部分是,对于中的每一行,如果日期变量早于给定行的日期变量Master_Data,我只想在平均值中包含分数Score_DataMaster_Data

例子:

对于第 1 行Master_Data,我希望新列返回 (3+5+7)/3 = 5 的值。但是,对于第 2 行,我只想看到 (3+5)/2 = 4,因为行3 inScore_Data的日期在 2/28 之后

想在这里获得这个新专栏的最佳方法是Master_Data什么?

标签: rmerge

解决方案


此解决方案适用于较小的数据集,但随着数据大小的增长,您将开始注意到性能问题。

library(lubridate)
library(dplyr)

master_data <- data.frame(
  ID = c('a','a','b','c','b'),
  Date = c('2018-03-31 00:00:00',
           '2018-02-28 00:00:00',
           '2018-06-07 00:00:00',
           '2018-01-31 00:00:00',
           '2018-02-09 00:00:00'))

master_data$Date <- ymd_hms(master_data$Date)

Score_Data <- data.frame(
  ID = c('a','a','a','b','b','c'),
  Date = c('2018-01-19 00:00:00',
           '2018-01-01 00:00:00',
           '2018-03-05 00:00:00',
           '2018-01-31 00:00:00',
           '2018-08-09 00:00:00',
           '2018-01-17 00:00:00'),
  Score = c(3,5,7,1,5,10))
Score_Data$Date <- ymd_hms(Score_Data$Date)

output <- apply(master_data, 1, function(x){

  value <- Score_Data %>%
    filter(ID == x[['ID']]) %>%
    filter(Date < x[['Date']]) %>%
    summarise(Val = mean(Score))

})

master_data$Output <- unlist(output)

推荐阅读