2017-12-18 15 views
-1

私は野生生物のGPSカラーデータを扱っています。 GPSカラーはシリアル番号で識別されます。数年の間に複数の動物に単一のGPSカラーを使用することができます。 GPSの襟から動物IDを各データポイントに割り当てる必要があります。動物IDは、正しい襟番号に割り当てる必要がありますが、捕獲日以降に撮影された場所、およびその動物の死亡日(該当する場合)の前またはその前にのみ割り当てられます。複数の列にわたる基準に基づいて2つのテーブルに結合する

以下は、私のデータがどのように見えるかの例です。

GPS首輪データは衛星経由でダウンロードされると、それは次の形式である:

CollarSerialNumber Latitude Longitude  Date 
1    36542 44.95511 -107.5431 2016-02-18 
2    36542 44.94927 -107.5855 2016-02-19 
3    36542 44.95027 -107.5838 2016-02-20 
4    36542 44.96125 -107.5831 2016-02-20 
5    36542 44.95949 -107.5854 2016-02-21 
6    36542 44.95233 -107.5717 2016-02-21 
7    36542 44.95743 -107.5664 2016-02-22 
8    36542 44.96124 -107.5840 2016-02-22 
9    36542 44.96322 -107.5799 2016-02-22 
10    36542 44.95912 -107.5857 2016-02-23 
11    36545 44.95263 -107.5207 2016-02-17 
12    36545 44.95278 -107.5202 2016-02-17 
13    36545 44.95366 -107.5481 2016-02-18 
14    36545 44.93453 -107.5940 2016-02-19 
15    36545 44.94563 -107.5823 2016-02-19 
16    36545 44.95020 -107.5836 2016-02-20 

私は動物の撮影日付(つまり、襟を動物に配備された日付を含む別のデータフレームを持っています)、動物ID、および死亡日付。

Animal_ID Collar_Serial Capture_Date Mort_Date 
1 16-046   36542 2016-02-18 2016-02-20 
2 16-047   36542 2016-02-21   NA 
3 16-048   36545 2016-02-17   NA 

は、だから私は襟シリアル番号とキャプチャおよび死亡率の日付に基づいて、Animal_IDを示しGPSカラーデータにAnimal_ID列を追加する必要があります。私の予想される出力は、次のようになります。

CollarSerialNumber Latitude Longitude  Date Animal_ID 
1    36542 44.95511 -107.5431 2016-02-18 16-046 
2    36542 44.94927 -107.5855 2016-02-19 16-046 
3    36542 44.95027 -107.5838 2016-02-20 16-046 
4    36542 44.96125 -107.5831 2016-02-20 16-046 
5    36542 44.95949 -107.5854 2016-02-21 16-047 
6    36542 44.95233 -107.5717 2016-02-21 16-047 
7    36542 44.95743 -107.5664 2016-02-22 16-047 
8    36542 44.96124 -107.5840 2016-02-22 16-047 
9    36542 44.96322 -107.5799 2016-02-22 16-047 
10    36542 44.95912 -107.5857 2016-02-23 16-047 
11    36545 44.95263 -107.5207 2016-02-17 16-048 
12    36545 44.95278 -107.5202 2016-02-17 16-048 
13    36545 44.95366 -107.5481 2016-02-18 16-048 
14    36545 44.93453 -107.5940 2016-02-19 16-048 
15    36545 44.94563 -107.5823 2016-02-19 16-048 
16    36545 44.95020 -107.5836 2016-02-20 16-048 
+0

何か試しましたか?どこで立ち往生しましたか? – MrFlick

+0

あなたの質問は(私に)明確ではありません。 GPSデータからの 'Date'は' Capture_Date'または 'Mort_Date'と一致する必要がありますか?あなたはあなたが与えるサンプルデータの期待される出力を含めるためにあなたの質問を編集してください。 –

+0

@MauritsEvers予想される出力で質問を編集しました。うまくいけば、それは今より明らかです。 – bfuda

答えて

0

私の問題は、かなりclunky解決策を思いついたが、それは動作します。以下を参照してください:

#get all Animal_IDs from capture dataset 
allID = unique(capdat$Animal_ID) 

#create list to hold data frames, one df for each animalID 
df.list <- as.list(rep("", length(allID))) 

#loop through each animal ID, find matching collar serial #, capture date, 
#and mortality date (if applicable) 
for (i in 1:length(allID)){ 
    ID.i = allID[i] 
    ser.i <- pull(capdat[capdat$Animal_ID == ID.i, 4]) 
    capdate.i = pull(capdat[capdat$Animal_ID == ID.i, 2]) 
    mortdate.i = pull(capdat[capdat$Animal_ID == ID.i, 11]) 

    ifelse(is.na(mortdate.i), 
     df.list[[i]] <- dat[(dat$CollarSerialNumber == ser.i & 
          dat$Date > capdate.i) ,], 
     df.list[[i]] <- dat[(dat$CollarSerialNumber == ser.i & 
          dat$Date > capdate.i & dat$Date < mortdate.i) ,]) 
    df.list[[i]]$Animal_ID = ID.i 
    } 

#merge list into a single data frame 
df <- ldply(df.list, data.frame) 

誰もがよりエレガントな解決策を考え出すことができる場合、私はそれを見てみたいです!

関連する問題