我正在尝试从 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列? 有更好的解决方案吗?
答案 0 :(得分:4)
如果您尝试为ecart
,cut
和color
的每个唯一组合识别具有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))
虽然我不确定这与问题的关系如何?