基于多列条件筛选颜色组合数据集的R语言技术需求
筛选颜色组合表的解决方案
根据你的需求,我们需要保留**恰好包含1个"ID"和1个"EMPTY"**的行(排除多出现或完全不出现的情况),以下是实现代码:
完整代码(base R 版本)
# 加载所需包 library(tidyr) # 定义颜色列表 colour <- c("BK", "CS", "DB","DG","LB","LG","MV","OR","RD","WT","YL","ID","EMPTY") # 生成所有4位组合 combo <- expand.grid(colour, colour, colour, colour) colnames(combo) <- c('A','B','C','D') # 逐行统计ID和EMPTY的出现次数 combo$id_count <- apply(combo, 1, function(row) sum(row == "ID")) combo$empty_count <- apply(combo, 1, function(row) sum(row == "EMPTY")) # 筛选符合条件的行:各恰好出现1次 filtered_combo <- subset(combo, id_count == 1 & empty_count == 1) # 移除辅助计数列 filtered_combo <- filtered_combo[, c("A", "B", "C", "D")]
可选:dplyr 版本(更直观的管道语法)
如果你习惯用dplyr的链式写法,可以这样实现:
library(tidyr) library(dplyr) colour <- c("BK", "CS", "DB","DG","LB","LG","MV","OR","RD","WT","YL","ID","EMPTY") combo <- expand.grid(colour, colour, colour, colour) %>% setNames(c('A','B','C','D')) filtered_combo <- combo %>% rowwise() %>% mutate( id_count = sum(c_across(A:D) == "ID"), empty_count = sum(c_across(A:D) == "EMPTY") ) %>% filter(id_count == 1 & empty_count == 1) %>% select(-id_count, -empty_count)
逻辑说明
- 先用
expand.grid生成所有4位颜色组合,重命名列便于后续处理 - 逐行统计"ID"和"EMPTY"的出现次数,作为筛选的核心依据
- 最后通过条件筛选,只保留两种标识各出现恰好1次的行,同时移除辅助统计列
内容的提问来源于stack exchange,提问作者Andre230
相关产品推荐
相关产品推荐

