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

使用dplyr按组计算忽略0与NA的年份最小值

解决按组计算最小年份并忽略NA和0的问题

先来看你的原始DataFrame结构:

df <- data.frame(
  group = c(1,1,1,2,2,3,3,3,3,4,4,4),
  year = c(2020, NA, 0, 2021, 2006, NA, 0, 2010, 2010, 2006, 2005, 2010)
)

你的需求很明确:按group字段分组后,为每一行新增minYr列,该值是对应分组中忽略NA和0值后的最小年份。

你最初尝试的代码df %>% group_by(group) %>% mutate(minYr = min(year, na.rm = TRUE))存在两个问题:

  • 没有排除0值,计算时会把0当作有效年份,导致结果不符合预期
  • 如果某组仅包含NA和0(你的数据里没这种情况,但需要考虑极端场景),min()会返回Inf,可能引发报错

正确的解决方法

我们可以先对year列做预处理,把NA和0统一转为NA,再计算每组的最小值,这样就能同时忽略这两种无效值:

library(dplyr)

df <- df %>%
  group_by(group) %>%
  mutate(
    # 将0和NA转为统一的NA,再计算最小值
    minYr = min(ifelse(year %in% c(NA, 0), NA, year), na.rm = TRUE)
  ) %>%
  ungroup() # 可选操作,不需要保留分组状态时执行

还有更简洁的写法,直接在分组内筛选出非0的年份再取最小(NA会自动被排除,因为NA与任何值比较结果都是NA,不会被纳入筛选范围):

df <- df %>%
  group_by(group) %>%
  mutate(
    minYr = min(year[year != 0], na.rm = TRUE)
  ) %>%
  ungroup()

验证结果

运行上述代码后,就能得到你期望的输出:

group  year minYr
   <dbl> <dbl> <dbl>
 1     1  2020  2020
 2     1    NA  2020
 3     1     0  2020
 4     2  2021  2006
 5     2  2006  2006
 6     3    NA  2010
 7     3     0  2010
 8     3  2010  2010
 9     3  2010  2010
10     4  2006  2005
11     4  2005  2005
12     4  2010  2005

补充:处理极端场景

如果你的数据中存在某组全是NA和0的情况,上面的代码会返回Inf,可以用ifelse设置默认值处理:

df <- df %>%
  group_by(group) %>%
  mutate(
    minYr = ifelse(
      all(is.na(year) | year == 0),
      NA, # 这里可以替换成你需要的默认值
      min(year[year != 0], na.rm = TRUE)
    )
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者questionmark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:33:15