R中使用expand_grid生成多个相同向量的唯一无序组合方法咨询
解决方法
你要的是带重复元素的组合,可以直接用以下两种方案实现:
方案1:直接生成目标结果(推荐,效率更高)
用R基础包的combn()函数,开启repeat.allowed参数允许元素重复,直接生成仅包含唯一无序组合的结果:
x <- 1:3 library(tibble) # 第二个参数指定要取的元素个数(对应你示例里的3列) result <- t(combn(x, m = 3, repeat.allowed = TRUE)) # 转成tibble和你示例格式对齐 colnames(result) <- c("a", "b", "c") as_tibble(result)
运行后输出刚好10行,完全符合你要的去重要求,不会出现元素相同仅排序不同的行。
方案2:对已生成的全排列结果去重
如果你已经用expand_grid()生成了全量结果,可以通过对每行元素排序后去重实现:
library(tidyr) library(dplyr) x <- 1:3 expand_grid(a = x, b = x, c = x) %>% rowwise() %>% # 把每行的元素排序后拼接成唯一标识 mutate(group_id = paste(sort(c(a, b, c)), collapse = "_")) %>% ungroup() %>% # 按唯一标识去重,保留第一行 distinct(group_id, .keep_all = TRUE) %>% # 去掉辅助列 select(-group_id)
两种方案的选择建议
- 数据量较大时优先选方案1,不需要先生成全量27行再过滤,性能更好
- 如果已经有生成好的全排列数据,或者需要保留原始排列的某一种顺序,选方案2更灵活
内容的提问来源于stack exchange,提问作者Freddie J. Heather
相关产品推荐
相关产品推荐

