按收获年份统计VHI低于40的月份数(含数据集及尝试代码)
解决方法:按harvestYear统计vhi≤40的月份数并新增列
问题分析
你之前的代码存在三个核心问题:
- 错误使用
yearmon作为分组依据,需求是按**harvestYear(结合区域唯一标识:gid、country、xcoord、ycoord)**分组,而非单个年月 - 将
vhi纳入分组变量,导致每个不同vhi值单独分组,无法正确统计全年干旱月份数 vhi列是字符类型,直接做数值比较会产生逻辑错误,需先转换为数值型
正确实现代码
方法1:使用dplyr(推荐,语法更清晰)
library(dplyr) # 1. 转换vhi为数值型,修复数据类型问题 df_clean <- df2 %>% mutate(vhi = as.numeric(vhi)) # 2. 按区域-年份分组,新增统计列(保留原数据集所有行) df_result <- df_clean %>% group_by(gid, country, xcoord, ycoord, harvestYear) %>% mutate(drought_months = sum(vhi <= 40, na.rm = TRUE)) %>% ungroup()
方法2:使用plyr(适配你之前的代码习惯)
library(plyr) # 1. 转换vhi为数值型 df2$vhi <- as.numeric(df2$vhi) # 2. 按区域-年份分组,新增统计列 df_result <- ddply(df2, .(gid, country, xcoord, ycoord, harvestYear), transform, drought_months = sum(vhi <= 40, na.rm = TRUE))
效果说明
- 新增的
drought_months列会将对应区域-年份下vhi≤40的月份数量填充到该组的每一行,完全保留原数据集的结构 - 示例中1982年gid=100468的分组,vhi≤40的月份有3个,所以该组所有行的
drought_months值均为3,符合你的预期
内容的提问来源于stack exchange,提问作者Shunrei
相关产品推荐
相关产品推荐

