R语言如何高效生成分组字符子集矩阵及跨组行全组合
解决方案
1. 高效生成分组对应的01子集矩阵
对于长字符向量,优先使用基于二进制位转换的向量化实现,比循环或expand.grid内存效率更高,核心逻辑是每个子集对应一个从0到2^n-1的整数,将整数转换为二进制位即可得到01标识:
# 入参为字符向量,返回对应所有子集的01数据框 generate_subset_mat <- function(char_vec) { n <- length(char_vec) total_rows <- 2^n # vapply指定返回值类型,比sapply更快更稳定 mat <- t(vapply(0:(total_rows - 1), function(num) { as.integer(intToBits(num))[1:n] }, FUN.VALUE = integer(n))) colnames(mat) <- char_vec return(as.data.frame(mat)) } # 测试调用 group_1 = c("X", "Y", "Z") group_2 = c("A", "B") group_1_combs <- generate_subset_mat(group_1) group_2_combs <- generate_subset_mat(group_2)
如果需要和示例完全一致的、按子集元素个数升序的排列,可额外增加排序逻辑:
group_1_combs <- group_1_combs[order(rowSums(group_1_combs)), ]
2. 两个子集矩阵全组合拼接
直接使用base R的merge函数,指定by=NULL即可生成两个数据集的笛卡尔积,自动合并所有列:
final_df <- merge(group_1_combs, group_2_combs, by = NULL)
验证输出结果:dim(final_df)返回32 5,列名为X Y Z A B,符合需求。
如果是tidyverse用户,也可以使用tidyr::crossing(group_1_combs, group_2_combs)实现相同效果。
内容的提问来源于stack exchange,提问作者plausibly_exogenous
相关产品推荐
相关产品推荐

