Mis*_*sha 9 r groupwise-maximum
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,]
Run Code Online (Sandbox Code Playgroud)
返回列表索引,而不是整个data.frame的索引
我试图返回b.2每个子组的最大值a.2.我怎样才能有效地做到这一点?
Aar*_*her 10
我认为,这些ddply和ave方法都是资源密集型的.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),]
Run Code Online (Sandbox Code Playgroud)
我认为性能提升超过ave或者ddply至少是实质性的.对于多列键来说,它稍微复杂一些,但是order会处理大量的事情以便duplicated对数据帧进行排序和处理,因此可以继续使用这种方法.
a.2<-sample(1:10,100,replace=T)
b.2<-sample(1:100,100,replace=T)
a.3<-data.frame(a.2,b.2)
Run Code Online (Sandbox Code Playgroud)
Jonathan Chang的回答可以为您提供明确要求的内容,但我猜您想要数据框中的实际行.
sel <- ave(b.2, a.2, FUN = max) == b.2
a.3[sel,]
Run Code Online (Sandbox Code Playgroud)