选择r中组中具有最大变量值的行

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

我认为,这些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),]
Run Code Online (Sandbox Code Playgroud)

我认为性能提升超过ave或者ddply至少是实质性的.对于多列键来说,它稍微复杂一些,但是order会处理大量的事情以便duplicated对数据帧进行排序和处理,因此可以继续使用这种方法.


had*_*ley 8

library(plyr)
ddply(a.3, "a.2", subset, b.2 == max(b.2))
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 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)
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)