R语言如何按年度分组条件填充数据框指定字段NA值
R语言按年份分组填充J车型销量缺失值实现方案
- 你构造的测试数据中
sales列的缺失值为字符串格式的"NA",并非R原生识别的缺失值,且整列存储为字符类型,无法直接做数值计算,需要先做类型转换:
# 将sales列转为数值类型,字符串"NA"会自动转换为R识别的缺失值NA df$sales <- as.numeric(df$sales)
方法1:基础R实现(无需安装第三方包)
核心逻辑是先按年份统计排除J车型后的年度最高销量,再匹配给对应年份的J车型做填充:
# 按年份分组,计算各年非J车型的最高销量 annual_max <- tapply( X = df$sales[df$model != "J"], INDEX = df$Year[df$model != "J"], FUN = max ) # 匹配年份给J车型赋值:年度最高销量+100 df$sales[df$model == "J"] <- annual_max[as.character(df$Year[df$model == "J"])] + 100
方法2:dplyr包实现(代码可读性更强)
如果日常使用tidyverse生态做数据处理,可以用分组突变的逻辑直接完成填充,代码逻辑更直观:
library(dplyr) df <- df %>% # 按年份分组 group_by(Year) %>% mutate( sales = case_when( # 仅对J车型的缺失值执行填充规则,其余数据保持不变 model == "J" & is.na(sales) ~ max(sales, na.rm = T) + 100, TRUE ~ sales ) ) %>% # 解除分组 ungroup()
填充结果校验:各年份J车型填充后的值分别为2015年1084、2016年2000、2017年877、2018年1103、2019年9011、2020年8988,完全符合「当年所有车型销量最大值加100」的要求。
内容的提问来源于stack exchange,提问作者user18948933
相关产品推荐
相关产品推荐

