首页 文章

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

提问于
浏览
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对应于全局索引 . 如果我查找新的[2,]它不是例如Fair,D,VS1类型 .

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

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

2 回答

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

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

  • 4

    如果您正在尝试为 cutcolorclarity 的每个唯一组合识别具有最低值 ecart 的钻石,那么您可能想要执行以下操作:

    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 .

    EDIT

    哈德利在评论中指出

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

    更优雅 . 它还将正确地拉出符合条件的所有行,以便最小化 .

相关问题