質問

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の最大値を返すようにしよう。どのように私はこれを効率的に行うことができますか?

役に立ちましたか?

解決

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

他のヒント

ddplyaveアプローチは、両方のかなりのリソースを大量に消費している、私は思います。 aveは(4つの列が一意キーを定義すると、67608行)私の現在の問題のためにメモリ不足で失敗しました。 tapplyは便利な選択肢ですが、私は一般的に行う必要があること(通常は複数の列で定義された)各一意のキーのために何か-estのいくつかの値を持つすべての行全体を選択しています。私が見つけた最良の解決策は、ソートを行い、その後、それぞれの固有のキーの最初の行のみを選択するように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ソートに物事の全体の束を処理します。

library(plyr)
ddply(a.3, "a.2", subset, b.2 == max(b.2))
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,]

これはやや面倒ではあるが、トリックを行います...しかし、それは私がGroupWiseの最大値の行をつかむことができます。他のアイデア?

> 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 
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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top