1

我试图从plyr包中的 Diamonds 数据集中找到价格/克拉方面的最佳交易

所以我愿意

    new = ddply(diamonds, c("cut", "color", "clarity"), transform, ecart= price/carat -  mean(price/carat))   
    best = ddply(new, c("cut", "color", "clarity"), summarize, which(ecart == min(ecart))

但是当我这样做时,我得到

    head(best)
    cut color clarity ..1  
    1 Fair     D      I1   4  
    2 Fair     D     SI2  49  
    3 Fair     D     SI1  39  
    4 Fair     D     VS2   9  
    5 Fair     D     VS1   2

因此,该索引似乎取自 ddply 制作的子组。这里只有第一个索引 4 对应于全局索引。例如,如果我查找 new[2,] 它不是 Fair、D、VS1 类型。

关于如何轻松检索全局索引位置的任何想法?

例如,您将如何优雅地添加一个 id 列?有更好的解决方案吗?

4

2 回答 2

4

如果您尝试为 和 的每个唯一组合识别具有最低值的钻石,ecart那么cut您可能打算执行以下操作:colorclarity

new <- ddply(diamonds, c("cut", "color", "clarity"), transform, 
         ecart= price/carat -  mean(price/carat))   
best <- ddply(new, c("cut", "color", "clarity"), 
         .fun = function(x){x[which.min(x$ecart),]})

这不需要在每个diamonds传递到的部分之外弄乱索引.fun

编辑

哈德利在评论中指出

ddply(new, c("cut","color","clarity"), subset, ecart == min(ecart))

更优雅。它还将正确地拉出所有符合条件的行,在最低限度的情况下。

于 2011-07-09T19:59:19.343 回答
2

我想我明白你想要什么。您可以which.min直接使用该函数来索引 ddply 返回的 data.frames。您只需要使用匿名函数即可:

ddply(new, c("cut", "color", "clarity"), function(x) x[which.min(x$ecart) ,])

至于你的第二个问题,你可以像这样生成一个 ID 列:

diamonds$id <- seq_len(nrow(diamonds))

虽然我不确定这与问题有什么关系?

于 2011-07-09T20:05:14.083 回答