求每一列的最大值和最小值,然后求每一行的最大值和最小值
Posted
技术标签:
【中文标题】求每一列的最大值和最小值,然后求每一行的最大值和最小值【英文标题】:Find the maximum and minimum value of every column and then find the maximum and minimum value of every row 【发布时间】:2015-01-09 16:06:56 【问题描述】:我有这个矩阵:
a <- matrix(rnorm(1000 * 18, mean = 100, sd = sqrt(10)), 1000, 18)
我想求每一列的最大值和最小值,以及每一行的最大值和最小值。
【问题讨论】:
【参考方案1】:想通了。
每列的最小值和最大值:
apply(a,2,min)
apply(a,2,max)
每行的最小值和最大值:
apply(a,1,min)
apply(a,1,max)
在这里找到信息http://www.personality-project.org/r/r.commands.html
【讨论】:
如何添加na.rm = TRUE
?
apply(a,2,min, na.rm = TRUE)
【参考方案2】:
你可以试试
apply(a, 1, range)
将它与t
一起使用,这将为您提供两列。第一个具有最小值,第二个具有最大行数。
head(t(apply(a, 1, range)))
[,1] [,2]
[1,] 95.75922 103.6956
[2,] 93.62636 106.3934
[3,] 92.70567 106.9190
[4,] 96.53577 104.4971
[5,] 96.61573 107.6691
[6,] 95.56239 105.5887
对于列最大值在 apply 函数中将 1 更改为 2。
【讨论】:
【参考方案3】:请参阅matrixStats
包。您可以将colMins()
、rowMaxs()
和类似的函数用于列和行。
看到这个答案:How to find the highest value of a column in a data frame in R?
【讨论】:
【参考方案4】:使用pmax()
和pmin()
可以更快地替代行最大/最小值,即使您首先必须将矩阵转换为列表(data.frame 是列表的一种特殊情况):
apply(a,1,min)
apply(a,1,max)
# becomes
do.call(pmin, as.data.frame(a))
do.call(pmax, as.data.frame(a))
对于列,由于必须先转置,它的“竞争力”会降低:
apply(a,2,min)
apply(a,2,max)
# becomes
do.call(pmin, as.data.frame(t(a)))
do.call(pmin, as.data.frame(t(a)))
基准测试:
a <- matrix(rnorm(1000 * 18 *10, mean = 100, sd = sqrt(10)), 1000 * 10, 18 * 10)
microbenchmark::microbenchmark(
do.call(pmin, as.data.frame(a)),
apply(a,1,min),
unit = "relative"
)
expr min lq mean median uq max neval
do.call(pmin, as.data.frame(a)) 1.000000 1.0000 1.000000 1.000000 1.000000 1.0000000 100
apply(a, 1, min) 2.281095 2.3576 2.096402 2.531092 2.618693 0.6284233 100
【讨论】:
显然有更快但更丑的版本:do.call(pmin, lapply(seq_len(ncol(a)), function(i) a[, i]))
以上是关于求每一列的最大值和最小值,然后求每一行的最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)