在R中筛选ID非唯一且对应Value相同的数据行
解决方案
先构造测试数据:
df <- data.frame( ID = c(1,1,1,2,3,3,4,4), Value = c("A","A","B","C","B","B","A","C") )
方法一:Base R
- 先找出出现次数大于1的ID:
id_counts <- table(df$ID) valid_ids <- names(id_counts[id_counts > 1])
- 统计每个
(ID, Value)组合的出现次数,筛选出符合条件的组合:
id_val_counts <- table(df$ID, df$Value) valid_pairs <- which(id_val_counts > 1, arr.ind = TRUE) valid_pairs <- data.frame( ID = rownames(valid_pairs), Value = colnames(valid_pairs)[valid_pairs[,2]] )
- 从原数据中匹配符合条件的行:
result <- subset(df, paste(ID, Value) %in% paste(valid_pairs$ID, valid_pairs$Value))
方法二:dplyr(更简洁)
先加载dplyr包,通过分组统计筛选:
library(dplyr) result <- df %>% # 按ID分组,计算每个ID的总出现次数 group_by(ID) %>% mutate(id_total = n()) %>% # 按ID+Value分组,计算该组合的出现次数 group_by(ID, Value) %>% mutate(val_count = n()) %>% # 取消分组,筛选条件:ID总次数>1,且该Value在对应ID中出现次数>1 ungroup() %>% filter(id_total > 1, val_count > 1) %>% # 移除临时统计列 select(-id_total, -val_count)
两种方法最终得到的结果都符合预期:
ID Value 1 1 A 2 1 A 3 3 B 4 3 B
内容的提问来源于stack exchange,提问作者Jason_bourne
相关产品推荐
相关产品推荐

