r - 按 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_Data
Master_Data
例子:
对于第 1 行Master_Data
,我希望新列返回 (3+5+7)/3 = 5 的值。但是,对于第 2 行,我只想看到 (3+5)/2 = 4,因为行3 inScore_Data
的日期在 2/28 之后
想在这里获得这个新专栏的最佳方法是Master_Data
什么?
解决方案
此解决方案适用于较小的数据集,但随着数据大小的增长,您将开始注意到性能问题。
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)
推荐阅读
- c# - 将 Dapper 与多个内部连接一起使用
- python - 为什么我们需要在 python 中的 f 字符串周围加上撇号?
- java - 使用 for 循环将对象添加到正确索引中的 ArrayList
- oracle - oracle 11G R2 Express Edition 支持多少个会话/连接?
- ios - Swift - 从 CollectionViewCell 中的 UIButton 推送到 ViewController
- oracle - 尝试在 MS Access 中链接 Oracle 表时,如何修复 ORA:01013(用户请求取消...)?
- python - ValueError:重命名:在 dst 中嵌入空字符
- javascript - 阻止跨域 XHR 或在起源/源处获取调用
- node.js - 使用 600 MB 及以上的大型 JSON 文件处理 Node js 的有效方法是什么?
- angular - 无法从 Opencart API 获取令牌