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
相关产品推荐
相关产品推荐

