Функция R which.max с tapply

Я пытаюсь сделать фрейм данных с максимальным количеством записей с коэффициентом. Мне нужен фрейм данных с 4 строками (по одной для каждого G) с максимальным значением X в этой группе и соответствующим значением Y. Я знаю, что мог бы написать цикл, но не хотел бы.

Data<-data.frame(X=rnorm(200), Y=rnorm(200), G=rep(c(1,2,3,4), each=50))
XMax<-tapply(Data$X, Data$G, function(x){max(x, na.rm=T)})
WhichXMax<-tapply(Data$X, Data$G, function(x){which.max(x)})

Функция which.max возвращает номер строки после того, как данные были подмножены с помощью фактора tapply, где я действительно хочу, чтобы номер строки ссылался на строки данных. Так что я мог бы сделать что-то вроде;

YMax<-Data$Y[Which]
MaxData<-data.frame(XMax=XMax, YMax=YMax, G=levels(Data$G))

person LoveMeow    schedule 18.05.2015    source источник


Ответы (3)


Вы можете использовать by и ссылаться на rownames строки, возвращаемой which.max:

Data[by(Data, Data$G, function(dat) rownames(dat)[which.max(dat$X)] ),]

#           X          Y G
#4   1.595281 -0.3309078 1
#61  2.401618  0.9510128 2
#147 2.087167  0.9160193 3
#171 2.307978 -0.3887222 4

(Это предполагает set.seed(1) для воспроизводимости)

person thelatemail    schedule 18.05.2015

library(dplyr)
Data %>% 
    group_by(G) %>% 
    filter(X==max(X))

Если вы не хотите включать галстуки, то

Data %>%
    group_by(G) %>%
    arrange(desc(X)) %>%
    slice(1)
person ExperimenteR    schedule 18.05.2015
comment
Я попробовал этот код на своих «реальных данных», и он дает мне на 6 строк больше, чем в длину (уровни (Data $ G)) есть идеи? Похоже, он сообщает об обеих строках, если есть ничья? Принимая во внимание, что принятый ответ просто выбирает один для галстука. Также не могли бы вы объяснить операцию %‹%, я не видел ее раньше! :) - person LoveMeow; 19.05.2015

person    schedule
comment
Проще: setDT(Data)[,.SD[which.max(X)],by=G] - person Frank; 18.05.2015