2017-12-18 4 views
-1

나는 야생 동물의 GPS 고리 데이터로 작업하고 있습니다. GPS 목걸이는 일련 번호로 식별됩니다. 단일 GPS 칼라는 여러 해 동안 여러 동물에 사용될 수 있습니다. GPS 고리에서 동물 ID를 각 데이터 포인트에 할당해야합니다. 동물 ID는 정확한 칼라 번호에 할당되어야하지만 캡처 날짜 이후 또는 그 동물의 사망일 (해당되는 경우) 이전 또는 이후에 찍은 위치에 대해서만 할당해야합니다.여러 열의 기준에 따라 두 테이블 조인

다음은 내 데이터의 모습입니다.

는 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 데이터의 '날짜'는 '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) 

누구나보다 세련된 해결책을 찾을 수 있다면보고 싶습니다.