如何高效匹配多列hospid的DataFrame以获取对应test列值?
高效匹配多ID映射的DataFrame方法
问题场景
我有两个DataFrame:
- df1存储参与者ID(部分参与者拥有多个ID但为同一人),数据定义如下:
df1 <-data.frame(hospid_1=c("A", "B", "C"), hospid_2=c("E", "", "I"), hospid_3=c("", "K", ""), test = c("jack", "will", "gil"))
- df2存储血液检测结果,其中的hospid与df1对应(列结构不同),数据定义如下:
df2 <- data.frame(hospid_1=c("A", "I", "K"), Feature=c("123", "456", "789"))
需求是将df1的test列与df2的hospid进行匹配,期望得到结果:
hospid Feature test 1 A 123 jack 2 I 456 gil 3 K 789 will
实际场景中df2有数千条hospid数据,希望找到比逐列使用left_join更高效简洁的方法。
解决方案
可以借助tidyverse工具集将df1的宽格式ID列转换为长格式,再一次性完成匹配,步骤如下:
- 加载依赖包(未安装的话先执行
install.packages("tidyverse")):
library(tidyverse)
- 转换df1为长格式ID映射表,过滤空ID值:
id_mapping <- df1 %>% pivot_longer(cols = starts_with("hospid_"), names_to = "id_column", values_to = "hospid") %>% filter(hospid != "") %>% select(hospid, test)
- 与df2进行匹配并整理结果:
final_result <- df2 %>% rename(hospid = hospid_1) %>% left_join(id_mapping, by = "hospid") %>% select(hospid, Feature, test)
这种方法仅需一次匹配操作,相比多次left_join更高效,尤其适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Rachel Hung
相关产品推荐
相关产品推荐

