请求助:生成向量所有可能组合(含逆序)的R语言技术问题
解决向量所有有序两两组合生成问题
看起来你之前用的方法应该是依赖了combn()这类生成无序组合的工具,这就是为啥逆序的配对没被输出的原因!combn()只会返回不重复的无序配对,比如对于c("a","b")只会给出a-b,不会包含b-a。下面给你两种简单的方法来生成包含逆序的所有有序组合:
方法1:用expand.grid()生成有序配对
expand.grid()会生成所有可能的笛卡尔积,正好能覆盖到逆序的情况,再配合简单的过滤和拼接就能得到你要的结果:
# 示例向量 v1 <- c("Testis_NOA_ID","Testis_NOA_IDSt") # 生成所有有序配对(包括自身配对) all_pairs <- expand.grid(v1, v1, stringsAsFactors = FALSE) # 如果你不需要自身配对(比如"Testis_NOA_ID-Testis_NOA_ID"),就过滤掉 filtered_pairs <- all_pairs[all_pairs$Var1 != all_pairs$Var2, ] # 拼接成你需要的格式 result <- apply(filtered_pairs, 1, function(x) paste(x[1], x[2], sep = "-")) # 输出结果 print(result)
运行这段代码后,你会得到:
[1] "Testis_NOA_ID-Testis_NOA_IDSt" "Testis_NOA_IDSt-Testis_NOA_ID"
方法2:用outer()快速生成所有组合
如果你想要更简洁的写法,可以用outer()函数直接生成所有拼接后的字符串,再按需过滤:
# 示例向量(多元素情况) v1 <- c("a","b","c") # 生成所有可能的组合(包括自身) all_combinations <- outer(v1, v1, paste, sep = "-") # 转成向量并过滤掉自身配对(如果不需要的话) result <- as.vector(all_combinations)[!grepl("^(.*)-\\1$", all_combinations)] # 输出结果 print(result)
这段代码会输出所有非自身的有序配对:
[1] "a-b" "b-a" "c-a" "a-c" "b-c" "c-b"
补充说明
- 如果你需要包含自身配对(比如
"a-a"),只需要去掉代码中过滤自身的部分即可。 - 这两种方法适用于任意长度的向量,不管是2个元素还是更多元素的情况,都能正确生成所有正序和逆序的组合。
内容的提问来源于stack exchange,提问作者AwaitedOne
相关产品推荐
相关产品推荐

