0

データフレームに列を追加したいと思います。列の値は、別の列の特定の要素の入力順序に基づいています。したがって、特に私のデータでは、ポイントへの最初の訪問に「1」、2回目の訪問に「2」、3回目の訪問に「3」などを設定したいと思います。ただし、一部のポイントでは、特定のポイントに繰り返し訪問します。日付と同じ訪問番号を共有する必要があります。

データフレームは事前に並べ替えられており、次のようになります。

  Transect Point    Date 
 1      BEN     1  5/7/12 
 2      BEN     1 5/10/12 
 3      BEN     1 5/10/12 
 4      BEN     2  5/8/12 
 5      BEN     2 5/11/12
 6      BEN     2 5/13/12

私はこのようなものを手に入れたいです:

 Transect Point    Date  Vist
1      BEN     1  5/7/12     1
2      BEN     1 5/10/12     2
3      BEN     1 5/10/12     2
4      BEN     2  5/8/12     1  
5      BEN     2 5/11/12     2
6      BEN     2 5/13/12     3
4

1 に答える 1

3

data.frameがSODFと呼ばれると仮定して、以下を使用しますave

within(SODF, {
  Visit <- ave(Point, Point, FUN = seq_along)
})
#   Transect Point    Date Visit
# 1      BEN     1  5/7/12     1
# 2      BEN     1 5/10/12     2
# 3      BEN     1 5/13/12     3
# 4      BEN     2  5/8/12     1
# 5      BEN     2 5/11/12     2

「トランセクト」や「ポイント」など、複数の列でグループ化する場合は、aveステートメントを次のように変更します。

ave(Point, Transect, Point, FUN = seq_along)

もちろん、ベースRとパッケージの両方を使用する他のアプローチもあります。これらのいくつかは、@Arunがここでの回答で要約およびベンチマークしています。


新しい質問の要件に対応するための更新

新しい要件を検討するときに頭に浮かぶ簡単な解決策の1つは、最初に一意のケースを抽出し、上記のようにインデックス生成を実行して、結果のテーブルを元のテーブルとマージすることです。

SODFunique <- SODF[!duplicated(SODF), ]
SODFunique <- within(SODFunique, {
  Visit <- ave(Point, Transect, Point, FUN = seq_along)
})
merge(SODF, SODFunique, sort = FALSE)
#   Transect Point    Date Visit
# 1      BEN     1  5/7/12     1
# 2      BEN     1 5/10/12     2
# 3      BEN     1 5/10/12     2
# 4      BEN     2  5/8/12     1
# 5      BEN     2 5/11/12     2
# 6      BEN     2 5/13/12     3
于 2013-03-08T18:35:43.777 に答える