gpt4 book ai didi

r - R 中两个向量中每个向量的 [1, 2, 3, ..., n] 元素的排列和组合

转载 作者:行者123 更新时间:2023-12-02 01:24:59 25 4
gpt4 key购买 nike

也许这样说是错误的,但我需要两个向量元素组合的所有可能排列,使用 R。这与我能找到的任何问题都不同。

两个向量的长度总是相等的。假设我们有这些向量(这些是某处两个数据帧中案例的唯一 ID 号):

vector1 <- 1:3
vector2 <- 1:3

nvec <- length(vector1)

我想要结束的是:

1    1
1 2
1 3
1 [1,2]
1 [1,3]
1 [2,3]
1 [1,2,3]
2 1
... and so on

然后它继续处理第一个向量的两个元素:

[1,2]    1
[1,2] 2
[1,2] 3
[1,2] [1,2]
[1,2] [1,3]
[1,2] [2,3]
[1,2] [1,2,3]
[1,3] 1
... and so on

以此类推,直到结束:

[1,2,3]  [1,2,3]

如何对任何给定长度的向量进行这种排列加组合?有时我需要为长度为 2 的向量提供所有这些组合,但对于长度为 10 的向量我也需要它。(我意识到那时我的 CPU 可能会遇到困难。)

--------------------

这是我到目前为止所做的:

从每个向量中获取一个元素,并获取所有排列:

library(gtools)
res <- permutations(nvec, 2, repeats.allowed=TRUE)
res
[,1] [,2]
[1,] 1 1
[2,] 1 2
[3,] 1 3
[4,] 2 1
[5,] 2 2
[6,] 2 3
[7,] 3 1
[8,] 3 2
[9,] 3 3

所以这两列代表了两个原始向量的元素个数,都是两者可能的组合。太好了。

但我还需要 vector1 的 2 个元素和 vector2 的 1 个元素的所有排列。

# these are all unique combinations of the elements in vector1: three in total

combinations(nvec, 2)

[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 2 3

我当然可以自己想到 (1,2)、(1,3) 和 (2,3)。但是我也想为更大的向量做这个,所以它变得更加困难,我需要这样一个函数。

现在我想置换 vector1 的 2 个元素与 vector2 的 1 个元素的这三个组合。所以结果应该是这样的:

[1, 2]    1
[1, 2] 2
[1, 2] 3
[1, 3] 1
[1, 3] 2
[1, 3] 3
[2, 3] 1
[2, 3] 2
[2, 3] 3

然后对 vector1 的所有三个元素和 vector2 的 1 个元素执行相同的操作,给出:

[1, 2, 3]  1
[1, 2, 3] 2
[1, 2, 3] 3

但我还需要 vector1 的 1 个元素和 vector2 的 2 个元素的所有排列:

1   [1, 2] 
2 [1, 2]
3 [1, 2]
1 [1, 3]
2 [1, 3]
3 [1, 3]
1 [2, 3]
2 [2, 3]
3 [2, 3]

以及每个元素的两个元素的所有组合:

[1, 2]   [1, 2]
[1, 2] [1, 3]
[1, 2] [2, 3]
[1, 3] [1, 2]
[1, 3] [1, 3]
[1, 3] [2, 3]
[2, 3] [1, 2]
[2, 3] [1, 3]
[2, 3] [2, 3]

然后还有 vector1 的两个元素和 vector2 的所有三个元素的所有组合,反之,vector1 的三个元素和 vector2 的两个元素的所有组合。

最后我需要将它拼接在一起(并排序)。但也许我在这里完全走错了路。

最佳答案

这是一个生成嵌套列表的方法:

# test vectors
vec1 <- 1:3
vec2 <- 4:6
# create all combinations of vector elements by length as nested list
comboList1 <- lapply(1:length(vec1), function(i) combn(vec1, i, simplify=FALSE))
comboList2 <- lapply(1:length(vec2), function(i) combn(vec2, i, simplify=FALSE))

# get fairly nested list of the Cartesian product of these lists
rapply(comboList1, function(i) rapply(comboList2, function(j) list(i, j),
how="list"), how="list")

作为一个更干净的阅读列表,你可以使用unlist如下:

# use unlist the results of combn to simplify results
comboList1 <- unlist(comboList1, recursive=FALSE)
comboList2 <- unlist(comboList2, recursive=FALSE)
# now use lapply:
unlist(lapply(vec1, function(i) lapply(vec2, function(j) return(list(i, j)))), recursive=FALSE)

unlist 的最终使用使列表变平,产生了一个两级列表,其中第二级是向量的比较。这是尽可能简化的。

关于r - R 中两个向量中每个向量的 [1, 2, 3, ..., n] 元素的排列和组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com