如何基于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
相关产品推荐
相关产品推荐

