سؤال

ودعونا نقول لدي 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> 

والآن لديك 'ن * (ن + 1) / 2' فرعية ويمكنك مؤشر بسيط لديك مصفوفة الأصلية.

نصائح أخرى

وأنا لا grokking تماما ما تقومون به ولذا فإنني سوف رمي للتو شيئا قد أو قد لا تساعد.

إليك ما أعتقد كمنتج الديكارتي من عمودين:

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

ويمكنك أيضا محاولة "العلاقات" الحزمة. هنا المصغر. يجب أن تعمل مثل هذه :

relation_table(x %><% x)

وعن طريق الإجابة ديرك ل:

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