1

次のようなデータフレームがあります。

FisherID    Year    Month   VesselID
1   2000    1   56
1   2000    1   81
1   2000    2   81
1   2000    3   81
1   2000    4   81
1   2000    5   81
1   2000    6   81
1   2000    7   81
1   2000    8   81
1   2000    9   81
1   2000    10  81
1   2001    1   56
1   2001    2   56
1   2001    3   81
1   2001    4   56
1   2001    5   56
1   2001    6   56
1   2001    7   56
1   2002    3   81
1   2002    4   81
1   2002    5   81
1   2002    6   81
1   2002    7   81

...そして、ID が 1 年間に変更される回数が必要なので、必要な出力は次のとおりです。

    FisherID    Year    DiffVesselUsed
1   2000    1
1   2001    2
1   2002    0

私はaggregate()を使ってそれを取得しようとしました:

aggregate(vesselID, by=list(FisherID,Year,Month ), length)

しかし、私が得たのは:

FisherID    Year    DiffVesselUsed
1   2000    2
1   2001    1
1   2002    1

Aggregate() は、同じ月にのみ出現した異なる船舶をカウントしたためです。成功せずに集計する別の方法を試しました。どんな助けでも大歓迎です。乾杯、ラファエル

4

1 に答える 1

3

最初の質問: 期待される出力は、あなたが求めているものを反映していないようです。1 年間に ID が変更される回数を尋ねますが、予想される出力は、VesselID1 年間に観察される一意の数を知りたいことを示しているようです。たとえば、2000 年には ID が 1 回変更され、2001 年には ID が 2 回変更されます。両方の年で、2 つの一意の ID が観察されます。

したがって、投稿した結果を取得するには、

FisherIDおよびによる統計を探している場合、同様Yearに調べる理由はありません。Month代わりに、 と の組み合わせごとに VesselID の一意の値を確認する必要がFisherIDありYearます。

aggregate(VesselID, by = list(FisherID, Year), function(x) length(unique(x)))
#   Group.1 Group.2 x
# 1       1    2000 2
# 2       1    2001 2
# 3       1    2002 1

ID の変更回数が本当に必要な場合は、rle関数を使用します。

aggregate(VesselID, by = list(FisherID, Year),
  function(x) length(rle(x)$values) - 1)
#   Group.1 Group.2 x
# 1       1    2000 1
# 2       1    2001 2
# 3       1    2002 0
于 2012-11-17T14:44:58.603 に答える