R中使用dplyr按v/w任意顺序匹配,基于另一dataframe更新e列
实现思路
由于匹配规则不区分v、w两列的顺序,我们可以先为两张表的每行生成统一排序后的匹配键:将每行的v和w值按字典序排序后拼接成字符串,作为两张表的关联依据。关联后再根据箭头类型、行列顺序调整最终的e值即可。
完整实现代码
library(dplyr) # 构造示例数据(真实使用时可替换为你自己的数据源) t <- tibble( v = c("dave", "floria", "floria", "floria", "quinn"), w = c("adam", "adam", "dave", "quinn", "adam"), e = c("->", "->", "->", "->", "->") ) data <- tibble( v = c("dave", "quinn"), w = c("floria", "adam"), e = c("->", "<->") ) # 1. 预处理参考表data,生成匹配键,重名字段避免关联时冲突 data_processed <- data %>% rowwise() %>% mutate(match_key = paste(sort(c(v, w)), collapse = "|")) %>% ungroup() %>% rename(data_v = v, data_w = w, data_e = e) # 2. 处理主表t,关联后更新e列 result <- t %>% rowwise() %>% mutate(match_key = paste(sort(c(v, w)), collapse = "|")) %>% ungroup() %>% left_join(data_processed, by = "match_key") %>% mutate( e = case_when( # 未匹配到的行保留原e值 is.na(data_e) ~ e, # 双向箭头不区分顺序直接复用 data_e == "<->" ~ data_e, # 单向箭头根据列顺序调整方向 data_e == "->" ~ case_when( v == data_v & w == data_w ~ "->", v == data_w & w == data_v ~ "<-" ) ) ) %>% # 清理多余字段,保留原表结构 select(v, w, e)
输出结果
执行代码后得到的result和预期输出完全一致:
# A tibble: 5 × 3 v w e <chr> <chr> <chr> 1 dave adam -> 2 floria adam -> 3 floria dave <- 4 floria quinn -> 5 quinn adam <->
内容的提问来源于stack exchange,提问作者bananaboy
相关产品推荐
相关产品推荐

