在R A组中选择具有可变的最大值的行

问题描述:

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指数在R A组中选择具有可变的最大值的行

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

+0

熔体(A.3,ID = C ( “A.2”)) - > H.2; cast(h.2,a.2〜,max) 在这个例子中做了窍门,但是当我将计算机应用到我的原始数据集时,计算机的内存不足。所以没有真正帮助我很多。 – Misha 2010-05-12 20:15:58

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

由乔纳森·常答案让你你明确地要求,但我猜你想从数据帧中的实际行。

sel <- ave(b.2, a.2, FUN = max) == b.2 
a.3[sel,] 
+0

这很简单,我必须承认..但是== b.2后面的逻辑超出了我的范围...... – Misha 2010-05-12 23:59:51

+0

ave生成的矢量只包含每个a.2的最大值b.2。因此,只要数据帧有行,它就会在其中设置真值。您正在使用逻辑向量来选择数据框中的行。如果你想看看它是如何工作的,将ave命令的结果添加到你的数据框中,然后查看它,与b.2列比较 - a.3 $ b.max John 2010-05-13 02:05:06

+0

Thx ...我感谢您的努力。 – Misha 2010-05-13 07:57:12

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,] 

这虽然有点麻烦,但它有点麻烦......但它允许我抓住组的最大值的行。任何其他想法?

> 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 

library(plyr) 
ddply(a.3, "a.2", subset, b.2 == max(b.2)) 
+0

我尝试过使用ddply函数,但它非常缓慢。我没有时间它,但它持续了一个咖啡杯和一趟卫生间,而我的原始数据集(210col * 16000rows)中仅使用了0.2s。 – Misha 2010-05-13 22:52:09

+1

这将在下一个版本中修复。但是除非你提供一个现实的例子,否则你不可能期望得到能够处理你的数据的答案! – hadley 2010-05-14 03:04:21

ddplyave方法都是相当耗费资源,我想。 ave由于我目前的问题(67,608行,有四列定义唯一键)而用完内存而失败。 tapply是一个方便的选择,但我通常需要做的是为每个唯一键(通常由多个列定义)选择具有something-est some-value的所有行。我找到的最佳解决方案是进行排序,然后使用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可以处理数据帧,所以可以继续使用这种方法。

+0

这是最容易使用的,并且在多列上运行良好 - 您只需在'duplicateated'中使用'cbind'。 – 2013-04-07 09:28:47

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