如何用R生成向量元素的所有组合(含非否定与否定变体)
R语言生成元素组合的两种实现方案
变体1:生成1到n个元素的所有无序组合
需求是从给定元素向量中,生成包含1到n个元素的所有不考虑排列的组合,将每个组合的元素拼接成字符串。
实现代码
# 定义输入元素向量 elements <- c("A", "B", "C") # 生成1到n个元素的所有组合并拼接 combinations_v1 <- unlist(lapply(1:length(elements), function(k) { # 生成k个元素的所有组合,再将每个组合的元素拼接为字符串 combn(elements, k, paste, collapse = "") })) # 查看结果 combinations_v1
代码说明
lapply(1:length(elements), ...):遍历从1到元素总数的所有组合长度combn(elements, k, paste, collapse = ""):生成指定长度k的所有元素组合,同时用paste将每个组合内的元素拼接成单个字符串unlist():将lapply返回的列表转换为一维向量
运行后得到的结果与示例一致:c("A", "B", "C", "AB", "AC", "BC", "ABC")
变体2:包含元素否定形式的全组合
需求是在变体1的基础上,为每个元素增加否定形式(前缀~),生成所有元素非否定、否定及它们的组合。
实现代码
# 定义输入元素向量 elements <- c("A", "B", "C") # 生成包含否定形式的所有组合 combinations_v2 <- unlist(lapply(1:length(elements), function(k) { # 生成k个元素的所有无序组合(以列表形式返回) elem_combs <- combn(elements, k, simplify = FALSE) # 对每个k元素组合,生成所有元素原形式/否定形式的笛卡尔积 lapply(elem_combs, function(comb) { # 为组合内的每个元素生成原形式和否定形式两个选项 elem_options <- lapply(comb, function(x) c(x, paste0("~", x))) # 生成所有选项的笛卡尔积 option_grid <- expand.grid(elem_options, stringsAsFactors = FALSE) # 将每行的选项拼接为单个字符串 apply(option_grid, 1, paste, collapse = "") }) })) # 按字符串长度排序,与示例顺序一致 combinations_v2 <- combinations_v2[order(nchar(combinations_v2))] # 查看结果 combinations_v2
代码说明
combn(elements, k, simplify = FALSE):生成指定长度k的元素组合,以列表形式返回方便后续处理lapply(comb, function(x) c(x, paste0("~", x))):为每个元素生成原形式和带~的否定形式expand.grid(elem_options, ...):生成所有元素选项的笛卡尔积,得到该元素组合下的所有可能原/否定搭配apply(option_grid, 1, paste, collapse = ""):将笛卡尔积的每一行(即一组搭配)拼接为单个字符串order(nchar(combinations_v2)):按字符串长度排序,让结果顺序与示例一致
运行后得到的结果与示例完全匹配,且支持任意数量的输入元素。
内容的提问来源于stack exchange,提问作者CNiessen
相关产品推荐
相关产品推荐

