You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于R语言按ths分组生成ph组合的行号索引矩阵

解决R语言按分组生成行号组合矩阵的问题

输入数据

首先定义目标数据集data2:

data2 <- data.frame(
  ths = c("Bu1", "Bu2", "Bu3", "Bu4", "Bu1", "Bu2", "Bu3", "Bu4", "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

需求说明

需要针对每个ths分组(Bu1、Bu2、Bu3、Bu4),生成该分组下不同ph对应的行号两两组合矩阵,具体组合包括:

  • Bu1 na vs Bu1 a
  • Bu1 na vs Bu1 u
  • Bu1 a vs Bu1 u
  • Bu2 na vs Bu2 a
  • Bu2 na vs Bu2 u
  • Bu2 a vs Bu2 u
  • Bu3 na vs Bu3 a
  • Bu3 na vs Bu3 u
  • Bu3 a vs Bu3 u
  • Bu4 na vs Bu4 a
  • Bu4 na vs Bu4 u
  • Bu4 a vs 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

背景说明

此前处理结构更简单的data1时,使用output1 = t(combn(seq_along(data1$ths),2))生成索引矩阵,但该方法无法直接套用在data2的分组场景中。

data1示例:

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
output1 = t(combn(seq_along(data1$ths),2))
> output1
     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    1    4
[4,]    2    3
[5,]    2    4
[6,]    3    4

解决方案

方法1:Base R 实现

通过split按ths分组,对每个分组的行号生成两两组合后合并结果:

# 为data2添加行号列
data2$row_num <- seq_len(nrow(data2))

# 按ths分组生成组合并合并
output2 <- do.call(rbind, lapply(split(data2$row_num, data2$ths), function(x) t(combn(x, 2))))

# 查看结果
output2

方法2:dplyr 实现

利用dplyr的分组功能结合combn生成组合:

library(dplyr)

output2 <- data2 %>%
  mutate(row_num = row_number()) %>%
  group_by(ths) %>%
  summarise(comb = list(t(combn(row_num, 2))), .groups = "drop") %>%
  pull(comb) %>%
  do.call(rbind, .)

# 查看结果
output2

两种方法均可生成符合预期的行号组合矩阵。

内容的提问来源于stack exchange,提问作者Av65

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:13:15