在R中为各值频率加条件扩展网格:颜色组合筛选需求
解决方法
我们可以通过分情况生成符合条件的组合,再合并结果来实现需求:
先拆分颜色集合:
- 普通颜色:排除"ID"和"EMPTY"的其他颜色
- 特殊颜色:仅包含"ID"和"EMPTY"
分别生成两种符合条件的组合:
- 情况1:某一列是"ID",其余三列为普通颜色
- 情况2:某一列是"EMPTY",其余三列为普通颜色
合并两种情况的结果,得到最终的有效组合表
修改后的R代码如下:
library(tidyr) # 拆分颜色集合 colour_all <- c("BK", "CS", "DB","DG","LB","LG","MV","OR","RD","WT","YL","ID","EMPTY") colour_normal <- colour_all[!colour_all %in% c("ID", "EMPTY")] colour_special <- c("ID", "EMPTY") # 生成情况1:单列是ID,其余为普通颜色 combo_id_A <- expand.grid(A = "ID", B = colour_normal, C = colour_normal, D = colour_normal) combo_id_B <- expand.grid(A = colour_normal, B = "ID", C = colour_normal, D = colour_normal) combo_id_C <- expand.grid(A = colour_normal, B = colour_normal, C = "ID", D = colour_normal) combo_id_D <- expand.grid(A = colour_normal, B = colour_normal, C = colour_normal, D = "ID") combo_id <- rbind(combo_id_A, combo_id_B, combo_id_C, combo_id_D) # 生成情况2:单列是EMPTY,其余为普通颜色 combo_empty_A <- expand.grid(A = "EMPTY", B = colour_normal, C = colour_normal, D = colour_normal) combo_empty_B <- expand.grid(A = colour_normal, B = "EMPTY", C = colour_normal, D = colour_normal) combo_empty_C <- expand.grid(A = colour_normal, B = colour_normal, C = "EMPTY", D = colour_normal) combo_empty_D <- expand.grid(A = colour_normal, B = colour_normal, C = colour_normal, D = "EMPTY") combo_empty <- rbind(combo_empty_A, combo_empty_B, combo_empty_C, combo_empty_D) # 合并两种情况,得到最终有效组合 combo_valid <- rbind(combo_id, combo_empty) # 可选:重置行号 rownames(combo_valid) <- NULL
代码说明
- 拆分颜色集合后,我们直接规避了生成包含多个特殊颜色、或同时包含两种特殊颜色的无效组合
- 通过分别生成单列特殊颜色的组合,确保每行仅包含一个"ID"或"EMPTY",且至少包含其中一个
- 最终的
combo_valid就是符合所有条件的颜色组合表
内容的提问来源于stack exchange,提问作者Andre230
相关产品推荐
相关产品推荐

