gpt4 book ai didi

r - 快速生成矩阵的笛卡尔积

转载 作者:行者123 更新时间:2023-12-04 10:13:16 24 4
gpt4 key购买 nike

假设我有一个矩阵 x其中包含 10 行和 2 列。我想生成一个新矩阵 M包含来自 x 的每对唯一的行- 也就是说,一个新的矩阵有 55 行和 4 列。

例如。,

x <- matrix (nrow=10, ncol=2, 1:20)

M <- data.frame(matrix(ncol=4, nrow=55))
k <- 1
for (i in 1:nrow(x))
for (j in i:nrow(x))
{
M[k,] <- unlist(cbind (x[i,], x[j,]))
k <- k + 1
}

所以, x是:
      [,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
[4,] 4 14
[5,] 5 15
[6,] 6 16
[7,] 7 17
[8,] 8 18
[9,] 9 19
[10,] 10 20

然后 M有 4 列,前两列是 x 中的一行接下来的 2 行是来自 x 的另一行:
> head(M,10)
X1 X2 X3 X4
1 1 11 1 11
2 1 11 2 12
3 1 11 3 13
4 1 11 4 14
5 1 11 5 15
6 1 11 6 16
7 1 11 7 17
8 1 11 8 18
9 1 11 9 19
10 1 11 10 20

在 R 中是否有更快或更简单(或两者兼有)的方法来做到这一点?

最佳答案

expand.grid()对此有用的函数:

R> GG <- expand.grid(1:10,1:10)
R> GG <- GG[GG[,1]>=GG[,2],] # trim it to your 55 pairs
R> dim(GG)
[1] 55 2
R> head(GG)
Var1 Var2
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 6 1
R>

现在你有 'n*(n+1)/2' 子集,你可以简单地索引你的原始矩阵。

关于r - 快速生成矩阵的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1428174/

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