R语言如何基于其他列数据填充数据框的缺失列值
基于已有非缺失行补全数据的实现方法
核心逻辑
从数据集中已经完成填充的行里,提取DESCRIPTION字段和GROUP、UCR字段的对应映射关系,再通过字段匹配把对应值回填到缺失行,避免手动枚举值出现的错漏,一次可以完成多列填充。
示例原始数据集结构如下:
OFFENSE GROUP DESCRIPTION UCR 0 3126 NaN ASSAULT NaN 1 3831 NaN PROPERTY DAMAGE NaN 2 724 NaN AUTO THEFT NaN 3 301 NaN ROBBERY NaN 4 619 NaN LARCENY ALL OTHERS NaN 245865 3115 Aggravated Assault ASSAULT Part One 245866 619 Larceny LARCENY ALL OTHERS Part One 245867 2629 Harassment HARASSMENT Part Two 245868 2629 Harassment HARASSMENT Part Two 245869 3208 Property Lost PROPERTY - MISSING Part Three
推荐实现(dplyr管道操作,适配现有代码风格)
library(dplyr) # 1. 构建映射字典:从非缺失行提取每个DESCRIPTION对应的唯一GROUP、UCR值 match_dict <- df %>% filter(!is.na(GROUP), !is.na(UCR)) %>% distinct(DESCRIPTION, GROUP, UCR) # 2. 左连接匹配回填缺失值 df_filled <- df %>% select(-GROUP, -UCR) %>% # 移除原表中带缺失值的待填充列 left_join(match_dict, by = "DESCRIPTION")
如果只需要保留UCR为Part One的记录,匹配完成后直接筛选即可:
df_part_one <- df_filled %>% filter(UCR == "Part One")
原有代码的错误点
- 列名不匹配:原数据中描述字段列名为
DESCRIPTION,代码中写的offence_name在表中不存在 - 判断语法错误:
case_when中判断某个值是否属于值列表,需要用%in%操作符,不能直接用=(单等号为赋值操作,无法做包含判断) - 填充逻辑不全:仅通过列表判断只能填充UCR列,无法同步填充对应的GROUP列,效率低且容易出现两列值不匹配的问题
如果要沿用列表判断的思路,修正后的代码如下:
# 提取Part One对应的DESCRIPTION列表 part1_desc_list <- unique(df$DESCRIPTION[df$UCR == "Part One"]) df <- df %>% mutate( UCR = case_when( DESCRIPTION %in% part1_desc_list ~ "Part One", TRUE ~ UCR # 不满足条件的行保留原有值 ) )
注意:该方法需要单独为GROUP列写匹配逻辑,不如映射表左连接的方式简便,更推荐第一种方案。
内容的提问来源于stack exchange,提问作者jikellie
相关产品推荐
相关产品推荐

