使用dplyr统计6月数值≥2000次数,如何保留计数为0的年份?
解决方法:保留计数为0的年份统计
你的问题出在提前过滤掉了不符合条件的行,导致那些没有6月val≥2000记录的年份直接被排除在分组数据之外,所以group_by(.drop=F)根本起不到作用——这些年份已经不在数据里了。下面给你两种可行的解决方案:
方法一:直接按全年份范围条件计数
先确定数据集覆盖的所有年份范围,然后对每个年份直接统计符合条件的记录数,没有的自动记为0:
# 生成数据中所有年份的序列(从最早到最晚) all_years <- seq(min(data$year), max(data$year), by = 1) swan_gtequal95 <- data %>% # 把原数据和全年份序列做左连接,确保每个年份都存在 right_join(tibble(year = all_years), by = "year") %>% group_by(year, .drop = F) %>% # 条件计数:统计6月且val≥2000的记录数,na.rm=T避免空值干扰 summarize(winterfloodfreq = sum(month == "06" & val >= 2000, na.rm = TRUE)) %>% ungroup()
方法二:先统计有效记录,再补全年份
如果你习惯先过滤有效记录,再补全缺失年份,需要明确指定完整的年份序列,而不是仅用complete(year)(默认只会补全原数据中出现过的年份):
swan_gtequal95 <- data %>% filter(month == "06", val >= 2000) %>% group_by(year) %>% summarize(winterfloodfreq = n()) %>% # 补全所有年份,缺失的计数填充为0 complete(year = seq(min(data$year), max(data$year), by = 1), fill = list(winterfloodfreq = 0))
注意事项
- 确保
month字段的格式统一(比如都是两位字符的"06",不是数值6),否则条件匹配会出错 - 如果你的年份范围不是数据中的最小到最大,而是固定的100年(比如1923-2022),直接把
seq(min(data$year), ...)改成seq(1923, 2022, by=1)即可
内容的提问来源于stack exchange,提问作者vermicellion
相关产品推荐
相关产品推荐

