如何在R语言中提取列表内多个矩阵的逐元素最小值矩阵
解决R语言中提取矩阵列表对应位置最小值的问题
嘿,这个场景我太熟悉了!你遇到的问题其实是因为lapply的作用逻辑和你想要的不一样——lapply是对列表里的每个元素单独执行函数,当你把pmin(x)传给它时,每个矩阵自己和自己比最小值,结果当然就是原矩阵本身啦,所以才会返回原列表😅。
下面给你两个实用的解决方案,不管列表里有多少个矩阵都能轻松搞定:
方法1:用do.call调用pmin
这是最直接的基础R解法,do.call的作用就是把列表中的所有元素作为参数传递给指定函数,完美替代你手动写pmin(a,b,c,...)的操作:
# 生成你的示例列表(设置随机种子方便复现结果) set.seed(123) mylist <- list(a=matrix(rnorm(10), ncol=2), b=matrix(rnorm(10), ncol=2), c=matrix(rnorm(10), ncol=2)) # 提取对应位置最小值的矩阵 result_matrix <- do.call(pmin, mylist) # 查看最终结果 result_matrix
这个方法的核心是do.call(pmin, mylist),它会自动把mylist里的所有矩阵(不管有多少个)作为pmin的参数,和你手动输入pmin(mylist$a, mylist$b, mylist$c)效果完全一致,但能处理任意长度的列表。
方法2:用purrr::reduce(适合tidyverse用户)
如果你习惯用tidyverse工具包,purrr里的reduce函数可以逐步将列表中的元素两两应用pmin,最终得到全局最小值矩阵:
library(purrr) result_matrix <- reduce(mylist, pmin)
这个方法的逻辑是:先计算前两个矩阵的对应最小值,再把结果和第三个矩阵比最小值,以此类推,最终得到所有矩阵对应位置的最小值,同样支持任意长度的列表。
两种方法都能解决你的问题,选哪个看你平时的代码习惯就好~
内容的提问来源于stack exchange,提问作者MilloMarinE
相关产品推荐
相关产品推荐

