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

如何用dplyr将数据框中特定条件下的0替换为NA?

问题解决:按国家-年份批量替换stock字段的0为NA

原数据

df <- data.frame(year=c(rep(2010,12),rep(2011,12),rep(2012,12)),
                country=c(rep("DEU",4),rep("ITA",4),rep("USA",4),
                          rep("DEU",4),rep("ITA",4),rep("USA",4),
                          rep("DEU",4),rep("ITA",4),rep("USA",4)),
                industry=c(rep(1:4,9)),
                stock1=c(rep(0,24),0,0,2,4,1,0,1,2,3,3,3,5),
                stock2=c(rep(0,24),0,3,3,4,5,0,1,1,2,2,2,5))

目标结果

df2 <- data.frame(year=c(rep(2010,12),rep(2011,12),rep(2012,12)),
                 country=c(rep("DEU",4),rep("ITA",4),rep("USA",4),
                           rep("DEU",4),rep("ITA",4),rep("USA",4),
                           rep("DEU",4),rep("ITA",4),rep("USA",4)),
                 industry=c(rep(1:4,9)),
                 stock1=c(rep(NA,24),0,0,2,4,1,0,1,2,3,3,3,5),
                 stock2=c(rep(NA,24),0,3,3,4,5,0,1,1,2,2,2,5))

需求规则

  • 若某一特定年份中,某国家的所有行业stock2字段值均为0,则将该国该年对应的stock1和stock2中的0替换为NA

原代码问题分析

原代码错误地按country, year, industry分组,每组仅包含单个行业的数据,导致all(stock2 == 0)只能判断当前单个行业的stock2是否为0,无法实现“该国该年所有行业stock2均为0”的判断逻辑。正确分组应为country, year,才能在组内覆盖所有行业的判断条件。

正确代码实现

library(dplyr)

df2 <- df %>%
  group_by(country, year) %>%
  mutate(
    # 判断当前国家-年份组的所有stock2是否全为0
    all_zero = all(stock2 == 0),
    # 满足条件时替换stock1的0为NA,否则保留原值
    stock1 = ifelse(all_zero & stock1 == 0, NA, stock1),
    # 同理处理stock2字段
    stock2 = ifelse(all_zero & stock2 == 0, NA, stock2)
  ) %>%
  # 移除临时辅助列
  select(-all_zero) %>%
  ungroup()

结果验证

运行代码后,2010、2011年所有国家的stock2均为0,对应年份的stock1和stock2中的0会被替换为NA,与目标数据df2完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:00:29