我试图从plyr包的钻石数据集中找到价格/克拉的最佳交易
所以我知道
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因此,指数似乎是从由蹒跚学步制作的子组中获得的。这里只有第一个索引,即4,对应于全局索引。如果我查一查new2,它就不是公平的类型,比如D,VS1。
知道如何轻松检索全局索引位置吗?
例如,如何优雅地添加id列?有没有更好的解决办法?
发布于 2011-07-09 19:59:19
如果您试图为ecart、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),]})这不需要在传递给.fun的每一段.fun之外处理索引。
编辑
哈德利在评论中指出
ddply(new, c("cut","color","clarity"), subset, ecart == min(ecart))更优雅。它还将正确地拉出符合条件的所有行,在领带最小的情况下。
发布于 2011-07-09 20:05:14
我想我很清楚你想要什么。您可以直接使用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))但我不知道这和问题有什么关系?
https://stackoverflow.com/questions/6637040
复制相似问题