문제

매트릭스가 있다고 가정 해 봅시다 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 개의 열이 있고, 처음 두 열은 1 행입니다. 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'서브 세트가 있으며 원래 행렬을 간단하게 색인 할 수 있습니다.

다른 팁

나는 당신이하고있는 일을 잘 불러 일으키지 않습니다. 그래서 나는 단지 도움이되지 않을 수도 있고 도움이되지 않는 것을 버릴 것입니다.

다음은 두 열의 직교 제품으로 생각하는 것입니다.

expand.grid(x[,1],x[,2])

"관계"패키지를 시도 할 수도 있습니다. 여기 비네팅이 있습니다. 다음과 같이 작동해야합니다.

relation_table(x %><% x)

Dirk의 답변 사용 :

idx <- expand.grid(1:nrow(x), 1:nrow(x))
idx<-idx[idx[,1] >= idx[,2],]
N <- cbind(x[idx[,2],], x[idx[,1],])

> all(M == N)
[1] TRUE

모두 감사합니다!

다른 답변에서 영감을 얻은 다음은 두 개의 매트릭스의 데카르트 제품을 구현하는 기능이 있습니다. 두 개의 매트릭스의 경우 전체 직교 제품의 경우 하나의 인수만으로 각 쌍 중 하나를 생략합니다.

cartesian_prod <- function(M1, M2) {
if(missing(M2)) {  M2 <- M1
     ind  <- expand.grid(1:NROW(M1), 1:NROW(M2))
     ind <- ind[ind[,1] >= ind[,2],] } else {
                                          ind  <- expand.grid(1:NROW(M1), 1:NROW(M2))}
rbind(cbind(M1[ind[,1],], M2[ind[,2],]))

}

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top