R语言中如何根据左表指示变量的值对两个表执行条件左连接
解决方案
核心逻辑是根据almanac_flag对应的年份规则,把d2的双列id映射合并为统一的id-description映射表,再和主表d关联即可,以下是两种常用实现方式:
方案1:重构d2为统一匹配表(代码更简洁,推荐)
先把d2的宽表结构转为长表,生成所有id和运动员描述的对应关系,直接左连接即可:
library(tidyverse) # 生成统一的id-描述映射表 d2_mapping <- d2 %>% pivot_longer(cols = c(card_id_1999, card_id_2009), values_to = "card_id") %>% select(card_id, description) # 直接关联得到结果 result <- d %>% left_join(d2_mapping, by = "card_id")
方案2:两次左连接后合并结果列
如果不想改d2的结构,可以分别按两个规则关联后,合并描述字段:
result <- d %>% # 先匹配1999版年鉴对应的id left_join(d2 %>% select(card_id_1999, description), by = c("card_id" = "card_id_1999")) %>% # 再匹配2009版年鉴对应的id left_join(d2 %>% select(card_id_2009, description), by = c("card_id" = "card_id_2009"), suffix = c("_1999", "_2009")) %>% # 合并两个描述列,优先保留非空值 mutate(description = coalesce(description_1999, description_2009)) %>% # 清除中间生成的临时字段 select(-description_1999, -description_2009)
两种方案输出的结果完全符合需求:card_id为48、2100、F7的行对应运动员描述,剩余未匹配的行description字段为NA。
内容的提问来源于stack exchange,提问作者logjammin
相关产品推荐
相关产品推荐

