如何用R基于县域月度历史数据计算加权累积灾害严重程度得分?
县域月度累积灾害得分计算实现方案
1. 准备工作:加载工具包
先安装并加载dplyr(R中新手友好的常用数据处理包):
# 首次使用先安装 install.packages("dplyr") # 加载包 library(dplyr)
2. 给数据按时间排序
必须保证每个县域的记录按年、月先后排列,否则滞后计算会出错:
# 假设你的原始数据框名为df,先完成排序 df_sorted <- df %>% arrange(county, year, month)
3. 计算加权累积得分
假设前1/2/3个月的权重分别为0.7、0.5、0.3(你可以根据需求直接修改这些系数),用lag()函数提取历史数据,按县域分组计算:
df_result <- df_sorted %>% # 按县域分组,确保只在同一个县内计算历史数据 group_by(county) %>% mutate( accumulated_drought_score = drought_score + lag(drought_score, 1)*0.7 + # 前1个月得分加权 lag(drought_score, 2)*0.5 + # 前2个月得分加权 lag(drought_score, 3)*0.3 # 前3个月得分加权 ) %>% # 取消分组,恢复普通数据框格式 ungroup()
关键说明
group_by(county):这一步绝对不能省略,否则会把不同县的记录混在一起计算滞后数据,结果完全错误。lag(x, n):用于提取当前行往上第n行的x值,每个县的前3条记录因为没有足够的历史数据,累积得分会显示为NA,和你提供的示例一致。- 权重可灵活调整,比如改成前1月0.8、前2月0.4、前3月0.2,直接修改代码中的系数即可。
用你提供的测试数据验证
把测试数据代入代码运行:
# 你的测试数据 df <- structure(list(county = c("Lafon", "Cueibet", "KapoetaEast", "KapoetaSouth", "Lafon", "Lafon"), year = c(2021, 2021, 2021, 2022, 2021, 2021), month = c(8, 8, 12, 4, 6, 11), drought_score = c(4.6, 4.6, 4.6, 4.6, 4.6, 4.6), accumulated_drought_score = c(NA, NA, NA, NA, NA, NA)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 运行代码后查看结果 print(df_result)
运行后Lafon县的记录会按6月、8月、11月排序:
- 6月:无历史数据,累积得分为
NA - 8月:仅前1个月(6月)数据,计算得
4.6 + 4.6*0.7 = 7.82 - 11月:有前1(8月)、前2(6月)个月数据,计算得
4.6 + 4.6*0.7 + 4.6*0.5 = 10.12
其他县仅1条记录,累积得分均为NA,完全符合预期。
内容的提问来源于stack exchange,提问作者J Clifford
相关产品推荐
相关产品推荐

