0

計算を実行するループが必要で、変数を (識別情報と共に) 新しいデータ フレームにエクスポートします。

私のデータは次のようになります。

各固有のサンプリング ポイント (UNIQUE) には、4 つのデータ ポイントが関連付けられています (WAVE によって異なります)。

   WAVE REFLECT REFEREN PLOT LOCAT COMCOMP     DATE UNIQUE
1 679.9     119       0    1     1       1 11.16.12      1
2 799.9     119       0    1     1       1 11.16.12      1
3 899.8     117       0    1     1       1 11.16.12      1
4 970.3     113       0    1     1       1 11.16.12      1
5 679.9     914   31504    1     2       1 11.16.12      2
6 799.9    1693   25194    1     2       1 11.16.12      2

そして、次のような新しいデータ フレームを作成したいと考えています。固有のサンプリング ポイントごとに、2 つの特定の「WAVE」測定値から「WBI」を計算したいと考えています。

WBI                     PLOT   ....  UNIQUE
(WAVE==899.8/WAVE==970)    1              1
(WAVE==899.8/WAVE==970)    1              2
(WAVE==899.8/WAVE==970)    1              3
4

1 に答える 1

0

入力data.frameのサイズによっては、効率の点でより良い解決策がある可能性がありますが、以下は小規模または中規模のデータセットで問題なく機能するはずであり、一種の単純なものです。

out.unique = unique(input$UNIQUE);

out.plot = sapply(out.unique,simplify=T,function(uq) {
    # assuming that plot is simply the first PLOT of those belonging to that
    # unique number. If not yo should change this.
    subset(input,subset= UNIQUE == uq)$PLOT[1];
});

out.wbi = sapply(out.unique,simplify=T,function(uq) {
    # not sure how you compose WBI but I assume that are the two last 
    # record with that unique number so it matches the first output of your example
    uq.subset = subset(input,subset= UNIQUE == uq);
    uq.nrow = nrow(uq.subset);
    paste("(WAVE=",uq.subset$WAVE[uq.nrow-1],"/WAVE=",uq.subset$WAVE[uq.nrow],")",sep="")
});

output = data.frame(WBI=out.wbi,PLOT=out.plot,UNIQUE=out.unique);

ただし、入力データが大きい場合は、レコードが「UNIQUE」でソートされているように見えるという事実を利用することをお勧めします。data.frameのサブセット化を繰り返すとコストがかかります。また、両方のsapply呼び出しを1つに組み合わせることができますが、少し面倒になるため、このままにしておきました。

于 2013-02-05T13:52:57.570 に答える