我有两个数据集,我想以一种不寻常的方式合并在一起。一个数据集是我的主集,其中包含一个标识符和与该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
中获得此新列的最佳方法的想法是什么?
答案 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)