4

max特定の列の関数を使用してデータ フレームを縮小しようとしています。他の列を保持したいが、各最大値が選択された同じ行の値を保持したい。例を示すと、この説明が簡単になります。

次のデータ フレームがあるとします。

dframe <- data.frame(list(BENCH=sort(rep(letters[1:4], 4)),
                          CFG=rep(1:4, 4),
                          VALUE=runif(4 * 4)
                         ))

これは私に与えます:

   ベンチ CFG 値
1 1 0.98828096
2 a 2 0.19630597
3 a 3 0.83539540
4 a 4 0.90988296
5 b 1 0.01191147
6 b 2 0.35164194
7 b 3 0.55094787
8 b 4 0.20744004
9 c 1 0.49864470
10c 2 0.77845408
11c 3 0.25278871
12c4 0.23440847
13 日 1 0.29795494
14 日 2 0.91766057
15 日 3 0.68044728
16 日 4 0.18448748

ここで、異なる BENCH ごとに最大値を選択するために、データを減らしたいと思います。

aggregate(VALUE ~ BENCH, dframe, FUN=max)

これにより、期待される結果が得られます。

  ベンチ値
1 0.9882810
2b 0.5509479
3c 0.7784541
4 日 0.9176606

次に、他の列を保持しようとしました。

aggregate(cbind(VALUE, CFG) ~ BENCH, dframe, FUN=max)

このリダクションは次を返します。

  ベンチバリューCFG
1 0.9882810 4
2 b 0.5509479 4
3c 0.7784541 4
4 日 0.9176606 4

VALUE と CFG の両方がmax関数を使用して削減されます。しかし、これは私が望むものではありません。たとえば、この例では、次の情報を取得したいと考えています。

  ベンチバリューCFG
1 0.9882810 1
2 b 0.5509479 3
3c 0.7784541 2
4 日 0.9176606 2

ここで、CFG は削減されませんが、それぞれの異なる BENCH の最大値に関連付けられた値を維持するだけです。

表示された最後の結果を得るために、削減を変更するにはどうすればよいですか?

4

3 に答える 3

5

問題が大規模なデータ (数百万または数千万の行とグループ) にスケーリングする場合は、パッケージdata.tableが重要になる可能性があります。関連する構文は次のとおりです。

require(data.table)
dtable <- data.table(dframe)
dtable[, .SD[which.max(VALUE),], by = BENCH]
于 2012-06-12T00:08:41.480 に答える
2

これがベースRソリューションです。

do.call(rbind, by(dframe, dframe$BENCH, FUN=function(X) X[which.max(X$VALUE),]))
#   BENCH CFG     VALUE
# a     a   1 0.9882810
# b     b   3 0.5509479
# c     c   2 0.7784541
# d     d   2 0.9176606
于 2012-06-11T22:48:46.693 に答える
1

パッケージddplyから使用できます:plyr

ddply(dframe, 
      .(BENCH), 
      function(df) return(df[df$VALUE==max(df$VALUE),]))
于 2012-06-11T22:46:34.283 に答える