2013-04-21 2 views
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() функция вокруг максимального значения. Я не могу найти свою ошибку, вы можете помочь мне, что не так. Благодарю.

ответ

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 
+0

Спасибо, я забыл 'применить()'. @liuminzhao – Duck

+1

Не используйте 'apply' на data.frame - он будет принуждать к матрице и, следовательно, быть неэффективным. – mnel

+0

Спасибо @mnel. Утка, пожалуйста, будьте в курсе совета Мнеля о неэффективности. – liuminzhao

1

max возвращает единственное значение, которое является максимальным значением всех аргументов, представленных ему. Таким образом, максимальное значение во всех трех колонок в вашем данном 1, что и `Макс возвращается:

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) 
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

+0

@mnel Вы правы! – dickoa

Смежные вопросы