0

私はRでこのように配置されたデータを持っています:

indv    time    mass
1         10    7
2          5    3
1          5    1
2          4    4
2         14    14
1         15    15

indv集団の中で個人はどこにいますか。mass_i初期質量( )と最終質量()の列を追加したいと思いますmass_f。昨日ddply、plyrで使用して初期質量の列を追加できることを学びました。

sorted <- ddply(test, .(indv, time), sort)
sorted2 <- ddply(sorted, .(indv), transform, mass_i = mass[1])

これは次のようなテーブルを提供します:

   indv mass time mass_i
1    1    1    5      1
2    1    7   10      1
3    1   10   15      1
4    2    4    4      4
5    2    3    5      4
6    2    8   14      4
7    2    9   20      4

ただし、これと同じ方法では、最終的な質量()を見つけることはできません。これmass_fは、個人ごとに観測数が異なるためです。観測数が異なる可能性がある場合、最終的な質量を見つける方法を誰かが提案できますか?

4

3 に答える 3

0

length(mass)最後の要素のインデックスとして単純に使用できます。

sorted2 <- ddply(sorted, .(indv), transform,
                 mass_i = mass[1], mass_f = mass[length(mass)])

mb3041023 で提案され、以下のコメントで説明されているように、データ フレームを並べ替えなくても同様の結果を得ることができます。

ddply(test, .(indv), transform,
      mass_i = mass[which.min(time)], mass_f = mass[which.max(time)])

行の順序を除いて、これは と同じsorted2です。

于 2012-11-15T20:12:33.260 に答える
0

tail(mass, 1)の代わりに使えますmass[1]

sorted2 <- ddply(sorted, .(indv), transform, mass_i = head(mass, 1), mass_f=tail(mass, 1))
于 2012-11-15T20:13:54.467 に答える
0

このテーブルを作成したら、それは非常に簡単です。

t <- tapply(test$mass, test$ind, max)

ind.これにより、namesとの値を持つ配列が得られmass_fます。

于 2012-11-15T20:15:26.373 に答える