如何在R中根据另一个DataFrame的列值过滤多列DataFrame的行?
解决方案
示例数据定义
先还原你的示例数据,方便测试:
library(dplyr) library(tidyr) df1 <- tibble(names = c("John", "Joan")) df2 <- tibble( `Column A` = c("Gerry", "John", "Ron"), `Column B` = c("Jim", "John", "Greg"), `Column C` = c("Brian", "John", "Sam"), `Column D` = c("Joan", "John", "Maisy") )
实现代码
用dplyr的行操作实现需求:
result <- df2 %>% rowwise() %>% # 提取当前行中与df1匹配的第一个名称 mutate(names = first(c_across(everything())[c_across(everything()) %in% df1$names])) %>% # 过滤无匹配的行 filter(!is.na(names)) %>% # 将names列移至最前 relocate(names, .before = everything())
代码说明
rowwise():指定后续操作按行执行,确保每一行独立检查匹配情况c_across(everything()):获取当前行所有列的数值,用于匹配检查first(...):如果一行有多个匹配项(比如示例第二行全是John),取第一个匹配值作为names列内容filter(!is.na(names)):剔除没有任何匹配的行relocate():调整列顺序,让names列放在最前面,与期望输出一致
为什么left_join不行?
left_join需要指定明确的匹配列,而你的需求是任意列匹配,无法通过简单的join操作实现,必须逐行检查所有列的匹配状态。
内容的提问来源于stack exchange,提问作者yardley
相关产品推荐
相关产品推荐

