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

R语言实现类Vlookup逻辑补全DataFrame生产年份缺失值

解决R语言中按产品填充缺失生产年份的问题

嘿,这个需求其实用dplyr就能轻松搞定——分组处理同产品的数据正是它的强项。我给你拆解一下具体实现步骤,还附了示例代码,你可以直接套用:

1. 先准备示例数据(模拟你的脏数据场景)

先造个和你场景匹配的测试数据框,方便你直观看到效果:

df <- data.frame(
  Product = c("A", "A", "B", "B", "C"),
  Production_Year = c(2018, 0, 2020, 0, 0),
  stringsAsFactors = FALSE
)

2. 核心处理逻辑(用dplyr实现)

我们的思路是按产品分组,找到每组里的有效生产年份最大值(排除0),再把组内的0值替换成这个最大值。如果某个产品全是0,就保留0不变:

library(dplyr)

df_cleaned <- df %>%
  # 按产品分组,确保同产品的处理逻辑一致
  group_by(Product) %>%
  mutate(
    # 计算每组的有效年份最大值(排除0,na.rm避免全0组报错)
    valid_year_max = max(Production_Year[Production_Year != 0], na.rm = TRUE),
    # 替换0值:如果是0且有有效年份,就用最大值;全0的话保留0
    Production_Year = ifelse(
      Production_Year == 0,
      ifelse(is.infinite(valid_year_max), 0, valid_year_max),
      Production_Year
    )
  ) %>%
  # 删掉临时生成的辅助列
  select(-valid_year_max) %>%
  # 取消分组,回到普通数据框结构
  ungroup()

运行后你会得到清理好的数据:

print(df_cleaned)
#   Product Production_Year
# 1       A            2018
# 2       A            2018
# 3       B            2020
# 4       B            2020
# 5       C              0

3. 大数据量可选:用data.table提速

如果你的数据量特别大,data.table的处理速度会更快,逻辑是一样的:

library(data.table)

# 把普通数据框转成data.table格式
setDT(df)
# 按产品分组替换0值
df[, Production_Year := ifelse(
  Production_Year == 0,
  max(Production_Year[Production_Year != 0], na.rm = TRUE),
  Production_Year
), by = Product]
# 把全0组的-Inf(max返回的特殊值)换回0
df[is.infinite(Production_Year), Production_Year := 0]

小提示

如果你的脏数据是NA而不是0,只需要把代码里的Production_Year == 0改成is.na(Production_Year)就可以直接复用逻辑啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:57:43