基于D、E列的值替换Basiswert列NA值的实现问题
问题:填充数据框中Basiswert列的NA值
我有一个包含D、E、Basiswert三列的数据框,其中Basiswert列存在部分NA值。需求为:当Basiswert列出现NA值时,用D列或E列中相同编号对应的Basiswert值进行替换。例如第2行Basiswert为NA,需替换为编号12442对应的USDCAD值。
原数据框结构
structure(list(D = c("12449", "12448", "12447", "12446", "12442", "12441", "12440", "12439", "12438", "12437"), E = c("0", "12442", "12442", "12430", "0", "12430", "12436", "12436", "12430", "12430" ), Basiswert = c("EURJPY", NA, "USDCAD", "EURAUD", "USDCAD", "EURAUD", NA, "GBPJPY", NA, "EURAUD")), class = "data.frame", row.names = c(NA, -10L))
原代码问题
你之前尝试的dplyr代码逻辑完全不符合需求,它的作用是仅保留Basiswert非空且D、E列相等的行的原值,其余全部设为NA,和填充NA的目标完全相反:
library(dplyr) data %>% mutate(Basiswert = ifelse(is.na(Basiswert) == FALSE & D == E, Basiswert, NA))
解决方案
我们可以先构建一个「编号-基准值」的映射表,再用这个映射表批量填充NA值:
library(dplyr) # 1. 构建编号与Basiswert的唯一映射表 value_map <- bind_rows( # 提取D列编号对应的有效Basiswert data %>% filter(!is.na(Basiswert)) %>% select(id = D, Basiswert), # 提取E列非0编号对应的有效Basiswert data %>% filter(!is.na(Basiswert), E != "0") %>% select(id = E, Basiswert) ) %>% distinct(id, .keep_all = TRUE) # 去重,确保每个编号只对应一个基准值 # 2. 填充Basiswert的NA值 data_filled <- data %>% mutate( # 优先用D列编号匹配映射表 Basiswert = ifelse(is.na(Basiswert), value_map$Basiswert[match(D, value_map$id)], Basiswert), # D列无匹配时,用E列非0编号匹配 Basiswert = ifelse(is.na(Basiswert) & E != "0", value_map$Basiswert[match(E, value_map$id)], Basiswert) ) # 查看结果 print(data_filled)
逻辑说明
- 映射表整合了所有有有效Basiswert的编号(包括D列全量、E列非0编号),并去重避免冲突;
- 填充时先尝试用当前行的D列编号找对应值,找不到再用E列编号(排除"0")匹配;
- 最终效果:第2行NA→USDCAD,第7行NA→GBPJPY,第9行NA→EURAUD,完全符合需求。
内容的提问来源于stack exchange,提问作者Hadsga
相关产品推荐
相关产品推荐

