R语言中:判断B列值是否存在于A列并提取对应C列值至D列
解决方法
你的问题出在ifelse(df$B %in% df$A, df$C , NA)只判断了B列值是否存在于A列,但直接取了当前行的C列值,而不是A列中匹配B值的那一行的C列值。以下是两种正确实现需求的方法:
基础R方案(无需额外包)
用match()函数获取B列每个值在A列中的位置索引,再用该索引提取对应行的C列值:
df$D <- df$C[match(df$B, df$A)]
match(df$B, df$A)会返回一个向量,每个元素是B列对应值在A列中的行号;若B值不在A列中,则返回NA- 用这个索引向量去取C列的值,就能得到A列中匹配B值的那一行的C值,不存在则为
NA
tidyverse/dplyr方案
如果习惯用dplyr的语法,可以通过左连接实现匹配:
library(dplyr) df <- df %>% # 把原数据的A、C列单独拿出来作为匹配表 left_join(df %>% select(A, C), by = c("B" = "A"), suffix = c("", "_match")) %>% # 将匹配到的C值赋值给新列D mutate(D = C_match) %>% # 移除临时生成的匹配列 select(-C_match)
示例验证
假设你的数据框是:
| A | B | C |
|---|---|---|
| 1 | 2 | x |
| 2 | 3 | y |
| 3 | 1 | z |
| 4 | 5 | w |
用基础R方案生成的D列结果为:y, z, x, NA,完全符合需求。
内容的提问来源于stack exchange,提问作者k34l
相关产品推荐
相关产品推荐

