R语言:如何将矩阵每行除行最大值外的所有值设为0?
处理亲缘矩阵:保留每行最大值其余置0的方法
直接上实操代码,分两种场景处理:
场景1:保留每行所有最大值(一行存在多个相同最大值时全保留)
假设你的亲缘矩阵名为rel_matrix,执行以下代码:
# 示例矩阵(替换成你自己的亲缘矩阵即可) rel_matrix <- matrix(c(0.8, 0.2, 0.1, 0.3, 0.9, 0.4, 0.5, 0.2, 0.7), nrow=3, byrow=TRUE, dimnames=list(c("A", "B", "C"), c("A", "B", "C"))) # 每行仅保留最大值,其余元素置0 processed_matrix <- t(apply(rel_matrix, 1, function(row) { row[row != max(row)] <- 0 row }))
apply(rel_matrix, 1, ...):按行遍历矩阵- 遍历每行时,将不等于该行最大值的元素设为0
- 用
t()转置是因为apply返回结果默认是列优先排列,转置后恢复原矩阵的行列结构
场景2:每行仅保留一个最大值(多个相同最大值时只留第一个)
如果一行里有多个相同的最大值,只想保留第一个,用这段代码:
processed_matrix <- t(apply(rel_matrix, 1, function(row) { max_val <- max(row) row[row != max_val] <- 0 # 若存在多个最大值,仅保留第一个 if(sum(row == max_val) > 1) { row[-which(row == max_val)[1]] <- 0 } row }))
生成边列表
处理完矩阵后,用reshape2包的melt函数生成边列表:
library(reshape2) # 转换为边列表 edge_list <- melt(processed_matrix, value.name = "relatedness", varnames = c("from", "to")) # 过滤掉值为0的无效边 edge_list <- edge_list[edge_list$relatedness != 0, ]
如果未安装reshape2,先运行install.packages("reshape2")完成安装。
内容的提问来源于stack exchange,提问作者ellonor
相关产品推荐
相关产品推荐

