按ID和日期合并和平均R中的数据

时间:2018-10-13 19:33:33

标签: r merge

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

> 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上增加一列,以给出ID df中该Score_Data得分的平均值。棘手的部分是,对于Master_Data中的每一行,如果Score_Data中的日期变量早于Master_Data中给定行的日期变量,我只想在平均值中包括分数

示例:

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

关于在Master_Data中获得此新列的最佳方法的想法是什么?

1 个答案:

答案 0 :(得分:0)

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

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)