2017-02-07 11 views
0

Я нашел ответ (сейчас deleted) на this question, и мне любопытно, почему он не работает.возвращать строки с максимальным/минимальным значением столбца по группам, используя plyr :: ddply

Вопрос: возвращает строку, соответствующую минимальному значению, по группе.

Так, например, учитывая набор данных:

df <- data.frame(State = c(rep('AK',4),rep('RI',4)), 
        Company = LETTERS[1:8], 
        Employees = c(82L, 104L, 37L, 24L, 19L, 118L, 88L, 42L)) 

... правильный ответ:

State Company Employees 
1: AK  D  24 
2: RI  E  19 

, как можно получить, например,

library(data.table); setDT(df)[ , .SD[which.min(Employees)], by = State] 

Мой вопрос, почему эта команда plyr::ddplyне работа:

library(plyr) 
ddply(df, .(State), summarise, Employees=min(Employees), 
     Company=Company[which.min(Employees)]) 
# returns: 
# State Employees Company 
# 1 AK  24  A 
# 2 RI  19  E 

Другими словами, почему which.min(Employees) возвращение 1 для каждой группы, а c(4,1)? Обратите внимание, что за пределами ddply, это работает:

summarise(df, minEmp = min(Employees), whichMin = which.min(Employees)) 
# minEmp whichMin 
# 1  19  5 

Я не использую plyr много, но я хотел бы знать, как правильно это сделать, если есть разумные один.

+0

@hrbrmstr Я видел, как ты ответил на мой комментарий, но потом он исчез - просто любопытно, что правильный способ сделать это с помощью 'plyr' бы ... – C8H10N4O2

ответ

1

Я получаю правильный ответ. не уверен, что о вашем случае ..

library(plyr) 
ddply(df, .(State), function(x) x[which.min(x$Employees),]) 
    State Company Employees 
1 AK  D  24 
2 RI  E  19 
+0

хорошо, что был достаточно прост, я соглашусь, когда разрешено – C8H10N4O2

+0

теперь он дает лет результаты? @ C8H10N4O2 в чем проблема? –

+0

нет проблем с вашим решением. оно работает. то, что я пробовал раньше (как описано в вопросе), не сработало. – C8H10N4O2

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

  • Нет связанных вопросов^_^