求助:迭代填补/还原企业缺失ID值的R函数问题
企业ID缺失值迭代填补逻辑问题求助
我长期浏览论坛,首次发帖,若表述有疏漏敬请谅解。现遇到以下技术问题:
- 手中有一份整合多来源的拼凑式面板数据集,包含18个不一致的企业ID变量,同一企业的观测中存在大量NA值,需还原缺失ID以尽可能完善数据。
- 该数据集为面板数据,企业随时间会发生合并、迁移、变更法律状态等情况,部分ID变量编码会随观测时间变化,此类冲突案例需过滤,避免错误填补。
- 我尝试编写迭代填补函数:提取变量名向量,循环遍历每个变量,按该变量分组后统计其他变量的唯一值数量,若其他变量唯一值均≤1则视为可填补组,用组内首个非NA值填补对应NA;否则视为冲突跳过。但当前代码循环逻辑有误,未能识别所有可填补数据。
示例数据
# 示例数据:ID 1可填补,ID 2不可填补 data <- data.frame(ID = c(1, 1, NA, 2, NA, 2, 2, 2), ID_Variable_1 = c(10, 10, NA, 20, 20, 20, 19, 18), ID_Variable_2 = c(NA, 8, 8, 16, 16, 16, NA, NA), ID_Variable_3 = c(NA, 8, 8, NA, 10, NA, NA, NA), ID_Variable_4 = c("A10", NA, NA, NA, NA, "B12", "B12", "B12"))
当前尝试代码
# 当前尝试代码 ### 提取变量名向量 column_vector <- names(data) ### 定义填补函数 Impute_missing_data <- function(data, column_vector){ #### 备份数据 temp_data <- data #### 遍历每个变量 for (i in column_vector) { #### 识别无冲突的可填补组 imputation_candidates <- temp_data %>% group_by_at(vars(i)) %>% summarise(across(everything(), ~ n_distinct(., na.rm = TRUE))) %>% filter(if_all(-i, ~ . <= 1), .preserve = TRUE) #### 获取可填补的ID值 imputation_applying <- imputation_candidates[[i]] #### 填补缺失值 temp_data <- temp_data %>% group_by_at(vars(i)) %>% mutate(across(everything(), ~ ifelse(.x %in% imputation_applying & is.na(.), first(.x[!is.na(.x)]), .x))) %>% ungroup() } #### 返回更新后的数据 return(temp_data) }
期望输出
# 期望输出 data_temp <- data.frame(ID = c(1, 1, 1, NA, 2, NA, 2, 2, 2), ID_Variable_1 = c(10, 10, 10, 11, 20, 20, 20, 19, 18), ID_Variable_2 = c(8, 8, 8, 12, 16, 16, 16, NA, NA), ID_Variable_3 = c(8, 8, 8, NA, NA, 10, NA, NA, NA), ID_Variable_4 = c("A10", "A10", "A10", NA, NA, NA, "B12", "B12", "B12"))
内容的提问来源于stack exchange,提问作者Sam Deegan
相关产品推荐
相关产品推荐

