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行、一意のキーを定義する4つの列)のメモリが不足して失敗します。tapplyは便利な選択ですが、私が一般的に行う必要があるのは、各一意のキー(通常は複数の列で定義されます)に対してsomething-estsome-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),]

ave少なくともddply、パフォーマンスの向上はかなりのものだと思います。複数列のキーの場合は少し複雑ですが、データフレームで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すると、各グループの最大値を1行で取得できます。

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 に答える