我已经得到了这个矩阵。
a <- matrix(rnorm(1000 * 18, mean = 100, sd = sqrt(10)), 1000, 18)
我想找出每一列的最大值和最小值以及每一行的最大值和最小值。
弄明白了。
每一栏的最小和最大。
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
见matrixStats
包。你可以对列和行使用colMins()
, rowMaxs()
和类似的函数。
你可以尝试
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
对于行最大/最小值,一个更快的选择是使用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