3

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()在最大值附近起作用。我找不到我的错误,你能帮我看看有什么问题吗?谢谢。

4

3 回答 3

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
于 2013-04-21T21:37:30.653 回答
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
于 2013-04-21T21:37:55.063 回答
1

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 )
于 2013-04-21T21:36:45.597 回答