【Tidyverse優(yōu)雅編程】跨表計算新列:變時間段內(nèi)指標(biāo)均值
這是比較復(fù)雜的數(shù)據(jù)操作問題,來自:
R語言怎么計算任意兩個日期之間的滑動平均?https://www.zhihu.com/question/537707630/answer/2529828627
1 問題轉(zhuǎn)述
主表?df
?是醫(yī)療檔案,包括病人 ID,地理位置,體檢時間1,體檢時間2
現(xiàn)在想計算一個新列:病人
所在地理位置
在體檢時間1
至體檢時間2
的時間段內(nèi),平均的PM2.5值
需要的氣象數(shù)據(jù)來自輔表?weather
,包括地理位置
,全部日期
每一天的?PM2.5值
。
2 先編一個小的演示數(shù)據(jù)
主表,醫(yī)療檔案:

輔表,氣象數(shù)據(jù):

3 解決問題
【程序說明】:
(1)先對輔表氣象數(shù)據(jù)?weather
?,關(guān)于位置?Location
?來個分組嵌套(列表列,這樣一個?Location
?就占一行了,從而讓操作邏輯更清晰:
data
列中的元,比如第 1 個,是這個樣子的:

(2)我們關(guān)心的是主表體檢數(shù)據(jù)?df
,在它基礎(chǔ)上做計算,所以右連接?df
?進(jìn)來:

(3)關(guān)鍵步驟是,用?mutate
?計算新列,需要在?data, T1, T2
?這 3 列上做三元逐行迭代:
根據(jù)?
data$time
?是否落在?T1, T2
?構(gòu)成的區(qū)間, 對?data
?篩選行再取出?
PM25
?求平均,結(jié)果返回數(shù)值
這就需要?pmap_dbl
?,把該迭代邏輯,寫成一個三元函數(shù),自變量分別用?..1, ..2, ..3
?指代。
具體實(shí)現(xiàn),可以先把函數(shù)寫出來,取出一組數(shù)據(jù)調(diào)試通過,再改寫成?purrr
?公式形式:
??
注:我開始想到的是,只在?data
?上做一元?map
?迭代, 直接使用?T1, T2
,但是不行,因?yàn)檫@樣每次迭代用的是整個?T1, T2
?列向量。
再一個, 管道里面套管道話,我習(xí)慣內(nèi)層管道用自帶的管道符:?|>
附錄
我主張的數(shù)據(jù)編程思維:

我的 R 語言新書:
https://zhuanlan.zhihu.com/p/198185888
已經(jīng)進(jìn)入出版流程,預(yù)計?22年8月?能與讀者見面。更多相關(guān)資源請參閱:
https://zhuanlan.zhihu.com/p/467134727