2017-02-07 53 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