如何基于查找表在R中高效实现缺失值的众数插补?
基于众数查找表高效插补缺失值的方法
问题背景
主数据集:
Id Date Col1 Col2 Col3 1211 01/14/2009 1 2 1 1211 03/19/2001 NA 0 2 1019 02/21/1999 2 1 NA 2023 03/09/2002 1 NA 0 1245 05/14/2022 0 1 NA
众数查找表:
Col1 Col2 Col3 0 1 0
需要用查找表中的众数对应插补主数据集中的NA,得到目标数据集:
Id Date Col1 Col2 Col3 1211 01/14/2009 1 2 1 1211 03/19/2001 0 0 2 1019 02/21/1999 2 1 0 2023 03/09/2002 1 1 0 1245 05/14/2022 0 1 0
以下是两种主流工具的高效实现方式:
R语言实现(dplyr)
将查找表转换为命名向量,再用across批量处理各列缺失值:
library(dplyr) # 构造主数据集 main_df <- tibble( Id = c(1211, 1211, 1019, 2023, 1245), Date = c("01/14/2009", "03/19/2001", "02/21/1999", "03/09/2002", "05/14/2022"), Col1 = c(1, NA, 2, 1, 0), Col2 = c(2, 0, 1, NA, 1), Col3 = c(1, 2, NA, 0, NA) ) # 构造众数查找表 mode_lookup <- tibble(Col1 = 0, Col2 = 1, Col3 = 0) # 转换为命名向量 mode_vec <- pull(mode_lookup, 1) %>% set_names(names(mode_lookup)) # 批量插补缺失值 filled_df <- main_df %>% mutate(across(all_of(names(mode_vec)), ~ifelse(is.na(.), mode_vec[cur_column()], .))) print(filled_df)
Python(Pandas)实现
将查找表转换为字典,直接传入fillna完成批量插补:
import pandas as pd # 构造主数据集 main_df = pd.DataFrame({ "Id": [1211, 1211, 1019, 2023, 1245], "Date": ["01/14/2009", "03/19/2001", "02/21/1999", "03/09/2002", "05/14/2022"], "Col1": [1, None, 2, 1, 0], "Col2": [2, 0, 1, None, 1], "Col3": [1, 2, None, 0, None] }) # 构造众数查找表 mode_lookup = pd.DataFrame({"Col1": [0], "Col2": [1], "Col3": [0]}) # 转换为字典(键为列名,值为对应众数) mode_dict = mode_lookup.iloc[0].to_dict() # 批量插补缺失值 filled_df = main_df.fillna(mode_dict) print(filled_df)
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

