创建两个变量组合的索引矩阵

问题描述 投票:0回答:1

我有这个带有四个变量的数据框

data2=data.frame(ths= c("Bu1", "Bu2", "Bu3", "Bu4"), ph=c("na", "na", "na", "na", "a", "a", "a", "a", "u", "u", "u", "u"), nca=c(56, 78, 34, 67, 43, 23, 24, 12, 76, 79, 56, 67), ca=c(29, 7, 51, 18, 13, 33, 32, 44, 4, 1, 23, 13))

> data2
   ths ph nca ca
1  Bu1 na  56 29
2  Bu2 na  78  7
3  Bu3 na  34 51
4  Bu4 na  67 18
5  Bu1  a  43 13
6  Bu2  a  23 33
7  Bu3  a  24 32
8  Bu4  a  12 44
9  Bu1  u  76  4
10 Bu2  u  79  1
11 Bu3  u  56 23
12 Bu4  u  67 13

对于每个值(Bu1、Bu2、Bu3、Bu4),我想基于此数据帧创建一个矩阵,其中每行对应于 ph 组合数据的行号

  • Bu1 na 与 Bu1 a
  • Bu1 na vs Bu1 u
  • Bu1 a 与 Bu1 u
  • Bu2 na 与 Bu2 a
  • Bu2 na vs Bu2 u
  • Bu2 a 与 Bu2 u
  • Bu3 na 与 Bu3 a
  • Bu3 na vs Bu3 u
  • Bu3 a 与 Bu3 u
  • Bu4 na 与 Bu4 a
  • Bu4 na 与 Bu4 u
  • Bu4 a 与 Bu4 u

这会导致这个输出

> output2
      [,1] [,2]
 [1,]    1    5
 [2,]    1    9
 [3,]    5    9
 [4,]    2    6
 [5,]    2   10
 [6,]    6   10
 [7,]    3    7
 [8,]    3   11
 [9,]    7   11
[10,]    4    8
[11,]    4   12
[12,]    8   12

在另一种情况下,我有第二个更简单的数据框,并且我想创建一个包含所有组合的矩阵,我使用了以下代码行。这个想法是为 data2 提供类似的东西。在这种情况下我没有成功找到方法。

data1=data.frame(ths= c("Bu1", "Bu2", "Bu3", "Bu4"), nca=c(56, 78, 34, 67), ca=c(29, 7, 51, 18))

> data1
  ths nca ca
1 Bu1  56 29
2 Bu2  78  7
3 Bu3  34 51
4 Bu4  67 18

outpu1 = t(combn(seq_along(data1$ths),2))

> outpu1
     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    1    4
[4,]    2    3
[5,]    2    4
[6,]    3    4

r combinations
1个回答
0
投票

您可以按组计算成对的行数组合:

do.call(rbind, with(data2, tapply(seq_along(ths), ths, \(x) t(combn(x, 2)))))

      [,1] [,2]
 [1,]    1    5
 [2,]    1    9
 [3,]    5    9
 [4,]    2    6
 [5,]    2   10
 [6,]    6   10
 [7,]    3    7
 [8,]    3   11
 [9,]    7   11
[10,]    4    8
[11,]    4   12
[12,]    8   12

如果您愿意

dplyr

library(dplyr)

data2 |>
  mutate(rn = row_number()) |>
  reframe(x = t(combn(rn, 2)), .by = ths) |>
  pull(x)

      [,1] [,2]
 [1,]    1    5
 [2,]    1    9
 [3,]    5    9
 [4,]    2    6
 [5,]    2   10
 [6,]    6   10
 [7,]    3    7
 [8,]    3   11
 [9,]    7   11
[10,]    4    8
[11,]    4   12
[12,]    8   12
© www.soinside.com 2019 - 2024. All rights reserved.