【问题标题】: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)

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

【问题讨论】:

    标签: r matrix max minimum


    【解决方案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]))
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-04
        • 2015-05-30
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 2014-10-17
        • 2014-12-01
        相关资源
        最近更新 更多