9
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)

r<-sapply(split(a.3,a.2),function(x) which.max(x$b.2))

a.3[r,]

返回列表索引,而不是整个 data.frame 的索引

b.2我试图返回每个子组的最大值a.2。我怎样才能有效地做到这一点?

4

6 回答 6

10

我认为ddplyave方法都相当耗费资源。ave由于我当前的问题(67,608 行,四列定义唯一键)内存不足而失败。tapply是一个方便的选择,但我通常需要做的是为每个唯一键(通常由多于一列定义)选择所有具有最佳某些值的整行。我发现的最佳解决方案是进行排序,然后使用否定duplicated来仅选择每个唯一键的第一行。对于这里的简单示例:

a <- sample(1:10,100,replace=T)
b <- sample(1:100,100,replace=T)
f <- data.frame(a, b)

sorted <- f[order(f$a, -f$b),]
highs <- sorted[!duplicated(sorted$a),]

我认为性能提升aveddply至少是可观的。多列键稍微复杂一些,但order会处理一大堆事情来排序和duplicated处理数据帧,所以可以继续使用这种方法。

于 2012-09-07T18:46:01.793 回答
8
library(plyr)
ddply(a.3, "a.2", subset, b.2 == max(b.2))
于 2010-05-13T12:54:08.843 回答
6
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)

Jonathan Chang 的回答为您提供了您明确要求的内容,但我猜您想要数据框中的实际行。

sel <- ave(b.2, a.2, FUN = max) == b.2
a.3[sel,]
于 2010-05-12T23:35:41.947 回答
1
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
m<-split(a.3,a.2)
u<-function(x){
    a<-rownames(x)
    b<-which.max(x[,2])
    as.numeric(a[b])
    }
r<-sapply(m,FUN=function(x) u(x))

a.3[r,]

这可以解决问题,尽管有点麻烦......但它允许我获取分组最大值的行。还有其他想法吗?

于 2010-05-12T22:06:02.347 回答
1
> a.2<-sample(1:10,100,replace=T)
> b.2<-sample(1:100,100,replace=T)
> tapply(b.2, a.2, max)
 1  2  3  4  5  6  7  8  9 10 
99 92 96 97 98 99 94 98 98 96 
于 2010-05-12T23:09:11.510 回答
0
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)

使用aggregate,您可以在一行中获得每个组的最大值:

aggregate(a.3, by = list(a.3$a.2), FUN = max)

这会产生以下输出:

   Group.1 a.2 b.2
1        1   1  96
2        2   2  82
...
8        8   8  85
9        9   9  93
10      10  10  97
于 2017-05-04T14:26:21.877 回答