在R语言中如何根据参考列匹配其他列并获取匹配列名
问题解决:匹配数据框中指定列对应值的列名
给定如下R语言数据框:
df <- data.frame( v1=c(1,2,3,4), v2=c("x","y","z","q"), v3=c("x","b","c","d"), v4=c("a","y","c","d"), v5=c("a","b","z","d"), v6=c("a","b","c","q") )
需求:以v2列为参考列,找出其他列中与v2列各行值匹配的列,并获取对应的匹配列名,最终得到指定格式的结果。
方法一:基础R实现
# 筛选出需要匹配的目标列(排除v1和v2) match_cols <- setdiff(names(df), c("v1", "v2")) # 逐行查找与v2值匹配的列名 df$match <- apply(df, 1, function(row) { target_val <- row["v2"] # 找到当前行中与目标值匹配的列 match_col <- match_cols[row[match_cols] == target_val] match_col }) # 整理成目标格式并输出 result <- df[, c("v1", "v2", "match")] names(result) <- c("Var 1", "Var 2", "match") print(result)
运行结果:
Var 1 Var 2 match 1 1 x v3 2 2 y v4 3 3 z v5 4 4 q v6
方法二:tidyverse 实现
如果习惯使用tidyverse工具链,可以用更简洁的代码:
library(tidyverse) df %>% rowwise() %>% # 查找v3到v6中与v2值匹配的列名 mutate(match = names(select(., v3:v6))[which(c_across(v3:v6) == v2)]) %>% # 选择并重命名列 select(v1, v2, match) %>% rename("Var 1" = v1, "Var 2" = v2)
注:以上代码默认每行只有一个匹配列,如果存在多列匹配的情况,可以将
match_col改为paste(match_col, collapse = ", ")来合并所有匹配的列名。
内容的提问来源于stack exchange,提问作者BenG
相关产品推荐
相关产品推荐

