如何在使用ddply时检索​​全局索引?

时间:2011-07-09 19:36:29

标签: r indexing plyr which

我正在尝试从 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对应于全局索引。 如果我查找新的[2,]它不是例如Fair,D,VS1类型。

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

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

2 个答案:

答案 0 :(得分:4)

如果您尝试为ecartcutcolor的每个唯一组合识别具有clarity的最低值的钻石,那么也许您打算做这样的事情:

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

更优雅。它还将正确地拉出符合条件的所有行,以达到最小值。

答案 1 :(得分: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))

虽然我不确定这与问题的关系如何?