如何通过匹配QuestionId与AltQuestionId填充TakerId缺失值?
嘿,我来帮你搞定这个缺失值填充的需求!核心思路就是先从有完整AltQuestionId和AltTakerId的行里,建立起问题ID和答题者ID的对应映射,再用这个映射去匹配填充TakerId列。下面给你两种实用的方法:
方法1:用dplyr(tidyverse生态)实现
这种方法代码可读性强,适合习惯tidy风格的用户:
library(dplyr) # 第一步:提取有效的问题ID-答题者ID映射关系 id_mapping <- df %>% filter(!is.na(AltQuestionId), !is.na(AltTakerId)) %>% select(QuestionId = AltQuestionId, TakerId_map = AltTakerId) # 第二步:用映射表填充TakerId,coalesce会优先取非NA的匹配值 df_filled <- df %>% left_join(id_mapping, by = "QuestionId") %>% mutate(TakerId = coalesce(TakerId_map, TakerId)) %>% select(-TakerId_map) # 查看最终结果 print(df_filled)
方法2:基础R原生实现(无需额外包)
如果不想加载第三方包,用基础R的match函数就能搞定:
# 先整理出无缺失的映射对 valid_matches <- na.omit(df[, c("AltQuestionId", "AltTakerId")]) colnames(valid_matches) <- c("Qid", "Tid") # 用match找到每个QuestionId对应的TakerId,自动保留NA(无匹配的情况) df$TakerId <- valid_matches$Tid[match(df$QuestionId, valid_matches$Qid)] # 查看结果 print(df)
两种方法最终都会得到你期望的输出:比如第6行QuestionId=1会匹配到AltQuestionId=1对应的AltTakerId=7,把TakerId填为7;第9行QuestionId=6会匹配到AltQuestionId=6对应的AltTakerId=17,完美对应你的示例结果。
内容的提问来源于stack exchange,提问作者Giulio
相关产品推荐
相关产品推荐

