【问题标题】:Combination of all pairs of rows using R使用 R 组合所有行对
【发布时间】:2020-01-29 09:03:29
【问题描述】:

这是我的数据集:

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  ")

对于“a”组中的每个案例和“b”组中的每个案例,我想将它们的 x、y、z 值组合成一行,所以我想要的数据矩阵或数据框如下所示:

      [,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

我想知道如何实现这个目标?非常感谢!

【问题讨论】:

标签: r dataframe data.table


【解决方案1】:

我们可以在group 的基础上split data 并使用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

【讨论】:

    【解决方案2】:

    您还可以对不匹配的 group 值进行连接(

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-22
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多