Kombinasi semua pasangan baris menggunakan R

Ini kumpulan data saya:

data <- read.table(header = TRUE, text = "
 group index group_index  x  y  z
     a     1          a1 12 13 14
     a     2          a2 15 20 22
     b     1          b1 24 17 28
     b     2          b2 12 19 30
     b     3          b3 31 32 33  ")

Untuk setiap kasus di grup "a" dan setiap kasus di grup "b", saya ingin menggabungkan nilai x, y, z dalam satu baris, sehingga matriks data atau kerangka data yang saya inginkan akan terlihat seperti:

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,] a1_b1   12    13    14    24    17    28  # x,y,z for a1, follows by x,y,z for b1
[2,] a1_b2   12    13    14    12    19    30  # x,y,z for a1, follows by x,y,z for b2  
[3,] a1_b3   12    13    14    31    32    33
[4,] a2_b1   15    20    22    24    17    28  # x,y,z for a2, follows by x,y,z for b1
[5,] a2_b2   15    20    22    12    19    30
[6,] a2_b3   15    20    22    31    32    33

Saya bertanya-tanya bagaimana cara mencapai tujuan ini? Terima kasih banyak!


person hard    schedule 30.09.2019    source sumber
comment
mungkin relevan: stackoverflow.com /questions/10600060/how-to-do-cross-join-in-r dan github.com/Rdatatable/data.table/issues/1717   -  person chinsoon12    schedule 30.09.2019


Jawaban (2)


Kita dapat split data berdasarkan group dan mengambil perkalian kartesius menggunakan merge

list_df <- split(data[c("x", "y", "z")], data$group)
out <- merge(list_df[[1]], list_df[[2]], by = NULL)
out[do.call(order, out), ]

#  x.x y.x z.x x.y y.y z.y
#3  12  13  14  12  19  30
#1  12  13  14  24  17  28
#5  12  13  14  31  32  33
#4  15  20  22  12  19  30
#2  15  20  22  24  17  28
#6  15  20  22  31  32  33
person Ronak Shah    schedule 30.09.2019

Anda juga dapat melakukan penggabungan pada nilai group yang tidak cocok (‹ alih-alih != untuk menghindari pasangan berulang)

library(data.table)
setDT(data)

data[data, on = .(group < group), 
     .(g = paste0(group_index, '_', i.group_index), 
       x, y, z, i.x, i.y, i.z),  
     nomatch = NULL]

#        g  x  y  z i.x i.y i.z
# 1: a1_b1 12 13 14  24  17  28
# 2: a2_b1 15 20 22  24  17  28
# 3: a1_b2 12 13 14  12  19  30
# 4: a2_b2 15 20 22  12  19  30
# 5: a1_b3 12 13 14  31  32  33
# 6: a2_b3 15 20 22  31  32  33
person IceCreamToucan    schedule 30.09.2019