2

私は電子的にタグ付けされた魚を扱っています。私のテレメトリ データ (データフレーム "d") のスニペットを以下に示します。各タイムスタンプは、一意の魚の検出を表します。

TagID          Detection              Location      RiverKm
163            02/23/2012 03:17:44    Alcatraz_E     4.414
163            02/23/2012 03:56:25    Alcatraz_E     4.414
163            04/14/2012 15:10:20    Alcatraz_E     4.414
163            04/14/2012 15:12:11    Alcatraz_N     4.414
163            03/11/2012 08:59:48    Alcatraz_N     4.414
163            03/11/2012 09:02:15    Alcatraz_N     4.414
163            03/11/2012 09:04:05    Alcatraz_N     4.414
163            03/11/2012 09:04:06    Alcatraz_N     4.414
163            03/11/2012 09:06:09    Alcatraz_N     4.414
163            03/11/2012 09:06:11    Alcatraz_E     4.414

多くの異なる TagID (個々の魚) があります。開始時刻 (「到着」) と終了時刻 (「出発」) を 1 時間の臨界値で識別することにより、各魚の遭遇期間に検出を分類したいと思います。たとえば、上記の魚 (TagID 163) の場合、出力は次のようになります。

TagID       arrival                  departure            Location        RiverKm
163        02/23/2012 03:17:44    02/23/2012 03:56:25     Alcatraz_E       4.414 
163        04/14/2012 15:10:2     04/14/2012 15:12:11     Alcatraz_N       4.414
163        03/11/2012 08:59:48    03/11/2012 09:06:11     Alcatraz_E       4.414

次のことを行うループ (またはその他のコード構造) を作成したいと思います。

for j in 1:length(unique(d$TagID))
  1. 最初の検出時刻 (「t1」) を特定する
  2. 時系列 (「t2」) でのそのタグの次の検出が t1 から 1 時間未満の場合、それをスキップして次の検出に進みます。それ以外の場合は、t1 を「到着」ベクトルに配置し、t2 を「出発ベクトル」に配置します。
  3. すべての到着および出発タイムスタンプが TagID ごとに分類された時点で停止します。

これを最も効率的な方法で行う方法がわかりません。ご協力をお願いします。

ありがとうございました!

4

2 に答える 2

2

最初にデータを日付順に並べる必要があります。そのため、検出変数を有効な r 日時型 (POSIXct) に変換する必要があります。diffを使用してデータを並べ替えcumsumたら、ジャンプ検出用のグループ変数を作成できます。ここでは、少なくとも 1 時間 (60 分) 後にジャンプが発生します。グループ化操作でシュガー構文を使用data.tableしていますが、大量のデータがない場合は特に必要ありません。

ここに私の完全なコード:

library(data.table)
## data coerecion
d$Detection <- 
  as.POSIXct(strptime(d$Detection,'%m/%d/%Y %H:%M:%S'))
## sort using Detecetion
d <- d[order(d$Detection),]
# id is incrementing variable that detects a jump of an hour
d$id <- cumsum(c(F,round(diff(d$Detection)/60) >60))
## you don't mention how to choose location,Riverkm so I take by default the first ones
setDT(d)[,list(start   =Detection[1],
               end     =Detection[length(Detection)],
               Location=Location[1],
               RiverKm =RiverKm[1]),
         "TagID,id"]

#    TagID id               start                 end   Location RiverKm
# 1:   163  0 2012-02-23 03:17:44 2012-02-23 03:56:25 Alcatraz_E   4.414
# 2:   163  1 2012-03-11 08:59:48 2012-03-11 09:06:11 Alcatraz_N   4.414
# 3:   163  2 2012-04-14 15:10:20 2012-04-14 15:12:11 Alcatraz_E   4.414
于 2014-10-08T22:35:34.450 に答える