You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:41:17