R语言查找数据框中对应另一列多值的单列重复值
问题说明
现有一个包含两列的R数据框(data.frame):
- 第一列列名为
A,存储数值 - 第二列列名为
B,存储字母
示例数据结构如下:
A B 1 a 1 a 1 a 2 b 2 c 3 d 4 e 4 e 5 f 5 g 5 g 5 h
数据规律为:多数A列的数值固定匹配同一个B列字母(例如1始终匹配a),但部分数值会匹配多个不同字母(例如2同时匹配b和c)。需求为查找所有匹配了多个不同字母的A列数值,以上述示例为例,最终返回结果应为包含2和5的向量。
可复现测试数据
运行以下代码即可加载示例数据:
example <- read.table(textConnection(' A B 1 a 1 a 1 a 2 b 2 c 3 d 4 e 4 e 5 f 5 g 5 g 5 h '), header = TRUE, colClasses=c("double", "character"))
实现方案
基础R(无需加载第三方包)
写法1(可读性更高)
# 按A列分组,统计每组对应不同B值的数量 group_stat <- aggregate(B ~ A, data = example, FUN = function(x) length(unique(x))) # 筛选匹配多个字母的A值,输出为向量 result <- group_stat$A[group_stat$B > 1]
运行后result的输出为[1] 2 5,符合预期。
写法2(更简洁)
result <- as.numeric(names(which(tapply(example$B, example$A, \(x) length(unique(x))) > 1)))
dplyr 实现(适合管道操作场景)
如果日常使用tidyverse生态,可使用以下写法,逻辑更直观:
library(dplyr) result <- example %>% distinct(A, B) %>% # 保留所有不重复的A-B配对 count(A) %>% # 统计每个A值对应的唯一B值数量 filter(n > 1) %>% # 筛选匹配数大于1的记录 pull(A) # 提取A列作为结果向量
内容的提问来源于stack exchange,提问作者user19050587
相关产品推荐
相关产品推荐

