如何在R语言中提取矩阵中的TRUE组合并去除重复?
R语言提取对称矩阵中TRUE的非重复组合
先给出目标矩阵MAT:
99 70 33 36 93 99 TRUE FALSE FALSE FALSE TRUE 70 FALSE TRUE FALSE FALSE FALSE 33 FALSE FALSE TRUE TRUE TRUE 36 FALSE FALSE TRUE TRUE FALSE 93 TRUE FALSE TRUE FALSE TRUE
矩阵的dput结构:
structure(c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE), dim = c(5L, 5L), dimnames = list( c("99", "70", "33", "36", "93"), c("99", "70", "33", "36", "93")))
需求说明
由于矩阵是对称结构,需要提取所有值为TRUE的行名与列名组合,同时去除重复的对称组合(例如(99,93)和(93,99)视为重复,仅保留一个),最终得到如下格式的结果:
[,1] [,2] [1,] 99 99 [2,] 99 93 [3,] 70 70 [4,] 33 33 [5,] 33 36 [6,] 33 93 [7,] 36 36 [8,] 93 93
已尝试的代码及结果
使用以下代码得到了列表形式的结果:
apply(MAT,1,function(data)names(which(data==T)))
输出结果:
$99 [1] "99" "93" $70 [1] "70" $33 [1] "33" "36" "93" $36 [1] "33" "36" $93 [1] "99" "33" "93"
解决方案
可以通过两种方式实现目标:
方法一:直接从矩阵提取并去重
- 获取所有
TRUE位置的坐标,转换为行名和列名组合:
# 获取所有TRUE的坐标 true_pos <- which(MAT, arr.ind = TRUE) # 转换为行名与列名的配对 true_pairs <- cbind(rownames(MAT)[true_pos[,1]], colnames(MAT)[true_pos[,2]])
- 利用对称矩阵特性筛选非重复组合(只保留行名≤列名的条目),再排序对齐示例格式:
# 筛选非重复组合 unique_pairs <- true_pairs[true_pairs[,1] <= true_pairs[,2], ] # 按行名、列名排序 unique_pairs <- unique_pairs[order(unique_pairs[,1], unique_pairs[,2]), ]
执行后unique_pairs即为目标矩阵:
> unique_pairs [,1] [,2] [1,] "99" "99" [2,] "99" "93" [3,] "70" "70" [4,] "33" "33" [5,] "33" "36" [6,] "33" "93" [7,] "36" "36" [8,] "93" "93"
方法二:基于已得到的列表转换
如果你想基于已生成的列表处理:
# 假设你的列表名为res_list res_list <- apply(MAT,1,function(data)names(which(data==T))) # 展开列表为数据框 pairs_df <- stack(res_list) # 重命名列 colnames(pairs_df) <- c("col", "row") # 筛选非重复组合并排序 unique_pairs_df <- pairs_df[pairs_df$row <= pairs_df$col, ] unique_pairs_df <- unique_pairs_df[order(unique_pairs_df$row, unique_pairs_df$col), ] # 转换为矩阵 unique_pairs_mat <- as.matrix(unique_pairs_df[, c("row", "col")])
内容的提问来源于stack exchange,提问作者user20062120
相关产品推荐
相关产品推荐

