3

さて、私はRにかなり慣れていないので、ドキュメントで何をする必要があるかを検索しようとしましたが、ここに問題があります。

次の形式のheeds.dataというdata.frameがあります(簡単にするために一部の列は省略されています)eval.num、eval.count、... Fitness、fitness.mean、green.h.0、green.v.0、 offset.0、green.h.1、green.v.1、... green.h.7、green.v.7、offset.7 .. ..

そして、次の基準を満たす行を選択しました。

best.fitness <- min(heeds.data$fitness.mean[heeds.data$eval.count >= 10])
best.row <- heeds.data[heeds.data$fitness.mean == best.fitness]

さて、私が欲しいのは、他のすべての行で、列green.h.0からoffset.7(列の連続セクション)がbest.rowに等しいことです。

私はこれがうまくいくかもしれないと思っていました

heeds.best <- heeds.data$fitness[
  heeds.data$green.h.0 == best.row$green.h.0 & ...
]

しかし、24列の場合、それはばかげた方法のようです。手作業での入力が少なく、少し簡単なものを探しています。

これが私が欲しいものを示すための短いデータサンプルです

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0
1         1           1500     1500          100        120        40
2         2           1000     1250          100        120        40
3         3           1250     1250          100        120        40
4         4           1000     1187.5        100        120        40
5         1           2000     2000          200        100        40
6         1           3000     3000          150        90         10
7         1           2000     2000          90         90         100
8         2           1800     1900          90         90         100

行4として「最良」を選択する必要があります次に、次のように結果を取得します

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0
1         1           1500     1500          100        120        40
2         2           1000     1250          100        120        40
3         3           1250     1250          100        120        40
4         4           1000     1187.5        100        120        40

データは実際には並べ替えられておらず、さらに多くの列がありますが、それが概念です

ありがとう!

4

1 に答える 1

4

あなたの質問は本質的に単なる複雑な索引付けの質問です。もっと簡単なものがあるかもしれませんが、私はここに解決策があります。サンプルデータを次の場所にロードしましたDF

まず、これにより、最適な行インデックスが得られます(簡単に使用できますwhich.min()):

R> bind <- which.min(DF[,"fitness.mean"])  # index of best row

次に、apply()行ごとの比較を行います(関心のある列のサブセットについて、ここでは5から7の位置でインデックスを作成します)。

比較関数を使用しcmpfunて、現在の行rを最適な行(によってインデックス付けされたbind)と比較しall()、すべての要素が対応する行を取得するために使用します。[drop=FALSEここでは、両側で比較できるようにする必要があります。そうでない場合as.numeric()は役立ちます。]

R> cmpfun <- function(r) all(r == DF[bind,5:7,drop=FALSE])  # compare to row bind

これは単にapplyこの行ごとに:

R> brows <- apply(DF[,5:7], 1, cmpfun)

そして、これらは私たちが望んでいた行です:

R> DF[brows, ]
  eval.num eval.count fitness fitness.mean green.h.0 green.v.0 offset.0
1        1          1    1500         1500       100       120       40
2        2          2    1000         1250       100       120       40
3        3          3    1250         1250       100       120       40
4        4          4    1000         1188       100       120       40
R> 

比較のために3つの列を使用することは重要ではありませんでした。重要なのは、必要な列のインデックス式(ここ5:7)があることだけです。

于 2010-04-03T19:11:17.493 に答える