找出每列的最大值和最小值,然后找出每行的最大值和最小值。

34

我有这个矩阵:

a <- matrix(rnorm(1000 * 18, mean = 100, sd = sqrt(10)), 1000, 18)

我想找到每一列的最大值和最小值,以及每一行的最大值和最小值。

4个回答

61

2
我该如何添加 na.rm = TRUE - Rafael
1
apply(a,2,min, na.rm = TRUE) - Rafael

6
你可以尝试。
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。


5

1

对于行最大/最小值的更快替代方法是使用 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])) - s_baldur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接