【Tidyverse优雅编程】跨表计算新列:变时间段内指标均值
这是比较复杂的数据操作问题,来自:
R语言怎么计算任意两个日期之间的滑动平均?https://www.zhihu.com/question/537707630/answer/2529828627
1 问题转述
主表 df
是医疗档案,包括病人 ID,地理位置,体检时间1,体检时间2
现在想计算一个新列:病人
所在地理位置
在体检时间1
至体检时间2
的时间段内,平均的PM2.5值
需要的气象数据来自辅表 weather
,包括地理位置
,全部日期
每一天的 PM2.5值
。
2 先编一个小的演示数据
主表,医疗档案:

辅表,气象数据:

3 解决问题
【程序说明】:
(1)先对辅表气象数据 weather
,关于位置 Location
来个分组嵌套(列表列,这样一个 Location
就占一行了,从而让操作逻辑更清晰:
data
列中的元,比如第 1 个,是这个样子的:

(2)我们关心的是主表体检数据 df
,在它基础上做计算,所以右连接 df
进来:

(3)关键步骤是,用 mutate
计算新列,需要在 data, T1, T2
这 3 列上做三元逐行迭代:
根据
data$time
是否落在T1, T2
构成的区间, 对data
筛选行再取出
PM25
求平均,结果返回数值
这就需要 pmap_dbl
,把该迭代逻辑,写成一个三元函数,自变量分别用 ..1, ..2, ..3
指代。
具体实现,可以先把函数写出来,取出一组数据调试通过,再改写成 purrr
公式形式:
注:我开始想到的是,只在 data
上做一元 map
迭代, 直接使用 T1, T2
,但是不行,因为这样每次迭代用的是整个 T1, T2
列向量。
再一个, 管道里面套管道话,我习惯内层管道用自带的管道符: |>
附录
我主张的数据编程思维:

我的 R 语言新书:
https://zhuanlan.zhihu.com/p/198185888
已经进入出版流程,预计 22年8月 能与读者见面。更多相关资源请参阅:
https://zhuanlan.zhihu.com/p/467134727