如何从数据框中的一组变量中提取最大值

时间:2013-04-21 21:29:00

标签: r

我在从一组变量中提取最大值时遇到函数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()函数围绕最大值。我找不到我的错误,你能帮我解决错误吗?感谢。

3 个答案:

答案 0 :(得分:3)

您的语句获取所有元素的最大值。尝试使用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

答案 1 :(得分:3)

您可以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

答案 2 :(得分:1)

max返回一个值,该值是提交给它的参数 all 的最大值。因此,数据中所有三列的最大值为1,即“max returns:

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参数使用位置匹配而不是显式命名):< / p>

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