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