使用dplyr在R数据框中查找与指定列值匹配的其他列
用dplyr找出与指定列值完全匹配的所有列
嘿,这个需求用dplyr来实现其实挺简单的!我来给你一步步拆解怎么做:
1. 先重现你的示例数据
首先咱们先把你给出的示例数据框写出来,方便后续测试:
library(dplyr) df <- data.frame( name = c("Andy", "Bob", "Andy", "Cha", "Andy", "Bob", "Dil"), num = c(1, NA, 0, NA, 1, NA, 0), place = c("Andy", "Bob", "Andy", "Cha", "Andy", "Bob", "Dil") )
2. 核心解决方案:找出匹配列的列名
我们可以用dplyr的across()和summarize()组合,来检查每一列是否和name列的所有值完全匹配:
# 找出所有与name列值完全匹配的列名 matching_cols <- df %>% summarize( # 对每一列,检查所有元素是否和name列对应位置相等 across(everything(), ~ all(.x == name, na.rm = FALSE)) ) %>% # 筛选出结果为TRUE的列(也就是匹配的列) select(where(~ .x)) %>% # 提取这些列的名字 names() # 查看结果 matching_cols # 输出: [1] "name" "place"
代码解释:
across(everything(), ~ all(.x == name, na.rm = FALSE)):遍历数据框的每一列,用all()判断该列的所有元素是否和name列对应位置完全相等。na.rm = FALSE是关键——它会严格处理NA值:如果两列对应位置都是NA,会被视为相等;如果一个是NA另一个不是,则不匹配。select(where(~ .x)):只保留那些判断结果为TRUE的列(也就是和name完全匹配的列)。names():把这些匹配列的列名提取出来,方便后续使用。
3. 扩展:直接获取匹配列组成的子数据框
如果你想要直接得到这些匹配列组成的子数据框,可以这样做:
df_matching <- df %>% select(all_of(matching_cols)) # 查看结果 df_matching # name place # 1 Andy Andy # 2 Bob Bob # 3 Andy Andy # 4 Cha Cha # 5 Andy Andy # 6 Bob Bob # 7 Dil Dil
补充说明
如果你的数据框里有不同数据类型的列(比如示例中的num是数值型,name是字符型),==比较时会自动识别类型不匹配,直接返回FALSE,所以不用担心不同类型的列被误判为匹配。
内容的提问来源于stack exchange,提问作者Avijit Mallick
相关产品推荐
相关产品推荐

