如何在R语言中按行提取矩阵a、b列组的最小值?
嘿,我来帮你搞定这个按行提取分组列最小值的需求!
先看你的数据,已经给矩阵设置了a和b的列名分组,要每行分别找出a列组和b列组的最小值,这里有两种实用的方法:
方法一:基础R原生方法
用apply配合split就能轻松实现,代码简单直接:
set.seed(1234) M = matrix(sample(20,20), ncol=4) colnames(M) = c("a","b","a","b") # 核心代码 result <- t(apply(M, 1, function(x) sapply(split(x, colnames(M)), min))) colnames(result) <- c("a", "b") # 查看结果 result
运行后输出就是你想要的:
a b [1,] 3 9 [2,] 5 1 [3,]11 4 [4,]15 8 [5,] 2 6
逻辑解释:
apply(M, 1, ...)按行遍历整个矩阵- 对每一行的数值向量,
split(x, colnames(M))会把它按列名分成a和b两个子组 sapply遍历这两个子组,分别计算最小值- 最后用
t()转置结果,让输出格式和原矩阵的行结构对应
方法二:tidyverse风格(适合数据框操作习惯)
如果你平时常用dplyr这类工具,可以用长格式转宽格式的思路来做:
library(dplyr) library(tidyr) library(tibble) set.seed(1234) M = matrix(sample(20,20), ncol=4) colnames(M) = c("a","b","a","b") result <- as_tibble(M, rownames = "row_id") %>% # 转成长格式,方便分组统计 pivot_longer(-row_id, names_to = "group", values_to = "value") %>% # 按行和分组取最小值 group_by(row_id, group) %>% summarise(min_val = min(value), .groups = "drop") %>% # 转回宽格式,恢复类似矩阵的结构 pivot_wider(names_from = group, values_from = min_val) %>% # 移除行号列并转成矩阵(可选,按需调整) select(-row_id) %>% as.matrix() result
这个方法更偏向数据处理的直观逻辑,适合习惯tidyverse生态的用户,结果和第一种方法完全一致。
内容的提问来源于stack exchange,提问作者John legend2
相关产品推荐
相关产品推荐

