我有这个带有四个变量的数据框
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 组合数据的行号
这会导致这个输出
> 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
您可以按组计算成对的行数组合:
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