【问题标题】:How to extract maximal value from a group of variables in a data frame如何从数据框中的一组变量中提取最大值
【发布时间】:2013-04-21 21:28:59
【问题描述】:

我在从一组变量中提取最大值时遇到函数max() 的问题。 data.frame 是下一个,所有变量都是数字:

setosa  versicolor  virginica
    0   0.96969697  0.03030303
    0   0.05128205  0.94871795
    0   0.96969697  0.03030303
    1   0.00000000  0.00000000
    1   0.00000000  0.00000000
    0   0.05128205  0.94871795
    0   0.05128205  0.94871795
    0   0.05128205  0.94871795

当我将 max() 函数应用于此数据框并尝试将其保存在新变量中时,它会发生:

DF$max=max(DF$setosa,DF$versicolor,DF$virginica)

setosa  versicolor  virginica   max
    0   0.96969697  0.03030303  1
    0   0.05128205  0.94871795  1
    0   0.96969697  0.03030303  1
    1   0.00000000  0.00000000  1
    1   0.00000000  0.00000000  1
    0   0.05128205  0.94871795  1
    0   0.05128205  0.94871795  1
    0   0.05128205  0.94871795  1

似乎max() 函数围绕最大值。我找不到我的错误,你能帮我看看有什么问题吗?谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    您的语句获取所有元素的最大值。尝试使用apply

    R > dat$max <-  apply(dat, 1, max)
    R > dat
      setosa versicolor  virginica      max
    1      0 0.96969697 0.03030303 0.969697
    2      0 0.05128205 0.94871795 0.948718
    3      0 0.96969697 0.03030303 0.969697
    4      1 0.00000000 0.00000000 1.000000
    5      1 0.00000000 0.00000000 1.000000
    6      0 0.05128205 0.94871795 0.948718
    7      0 0.05128205 0.94871795 0.948718
    8      0 0.05128205 0.94871795 0.948718
    

    【讨论】:

    • 谢谢,我忘记了apply()。 @liuminzhao
    • 不要在data.frame上使用apply——它会强制转换为矩阵,因此效率低下。
    • 谢谢@mnel。鸭子,请注意 mnel 关于低效率的建议。
    【解决方案2】:

    您可以为此使用pmax

    set.seed(123)
    dat <- data.frame(matrix(rnorm(15), ncol = 3))
    
    
    
    cbind(dat,
          max = pmax(dat$X1, dat$X2, dat$X3)
    )
    
    ##         X1        X2       X3     max
    ## 1  0.42646  0.688640 -0.69471 0.68864
    ## 2 -0.29507  0.553918 -0.20792 0.55392
    ## 3  0.89513 -0.061912 -1.26540 0.89513
    ## 4  0.87813 -0.305963  2.16896 2.16896
    ## 5  0.82158 -0.380471  1.20796 1.20796
    

    【讨论】:

    • do.call(pmax, data[c('X1','X2','X3']) 提供了另一种方法(也许更容易扩展)
    【解决方案3】:

    max 返回单个值,该值是提交给它的所有个参数的最大值。因此,数据中所有三列的最大值为 1,这是 `max 返回的值:

    max(df$setosa,df$versicolor,df$virginica)
    [1] 1
    

    然后,您将其分配给 data.frame 中的新列,并且由于 R 的设计方式,分配发生回收,因此从 max 返回的值被重复使用,直到它被分配给的向量的大小已满,在本例中为数据框中的行数。

    如果你想要每列的最大值,做

    apply( df , 2 , max )
       setosa versicolor  virginica 
     1.000000   0.969697   0.948718 
    

    它将max 函数应用于每一列并返回结果。如果您想知道哪一行包含每列的max 值,请使用which.max,就像这样

    apply( df , 2 , which.max )
     setosa versicolor  virginica 
         4          1          2 
    

    如果您希望 max 按行跨越值,请将 MARGIN 参数设置为 apply 为 1(这里 MARGIN 参数是使用位置匹配设置的,而不是显式命名):

    df$max <- apply( df , 1 , max )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 2020-11-11
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2017-10-10
      相关资源
      最近更新 更多