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

3

我在从一组变量中提取最大值时遇到了函数max()的问题。数据框如下,所有变量均为数字:

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个回答

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

1
do.call(pmax, data[c('X1','X2','X3')]) 提供了一种替代方法(可能更容易扩展)。 - mnel

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

谢谢,我忘记了 apply()。@liuminzhao - Duck
1
不要在 data.frame 上使用 apply -- 它会强制转换为矩阵,从而效率低下。 - mnel
感谢@mnel。Duck,请注意mnel关于效率低下的建议。 - liuminzhao

1

max函数返回一个数值,即其所有参数中的最大值。因此,在您的数据的三列中,跨所有列的最大值为1,这就是`max`返回的结果:

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

你需要将它分配给数据框中的一个新列,由于R的设计方式,当分配发生时,回收会发生,因此从最大值返回的值会被重复使用,直到分配给它的向量大小已满,即数据框中的行数。
如果你想要每一列的最大值,请执行以下操作:
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 )

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