중복 / 중복 된 항목에 대해 더 오랜 기간 동안 이루어진 조류 관찰을 확인해야합니다.
다른 지점 (A, B, C)의 관찰자들은 관찰하여 종이지도에 표시했습니다. 종, 관측점 및 시간 간격에 대한 추가 데이터가 포함 된 선 특징으로 가져온 선.
일반적으로 관찰자는 관찰하면서 전화를 통해 서로 통신하지만 때로는 잊어 버려서 중복 선을 얻습니다.
이미 원을 터치하는 선으로 데이터를 줄 였으므로 공간 분석을 할 필요는 없지만 각 종의 시간 간격 만 비교하면 비교에서 찾은 것과 동일한 개체라는 것을 확신 할 수 있습니다 .
이제 R에서 다음과 같은 항목을 식별하는 방법을 찾고 있습니다.
- 같은 날에 겹치는 간격으로 만들어집니다.
- 그리고 같은 종인 곳
- 서로 다른 관측점 (A 또는 B 또는 C 또는 ...)으로 만들어졌습니다.
이 예에서는 동일한 개인의 중복 항목을 수동으로 발견했습니다. 관찰 지점이 다르고 (A <-> B), 종은 동일하며 (Sst) 시작 및 종료 시간 간격이 겹칩니다.
이제 data.frame에 새 필드 "중복"을 만들어 두 행 모두에 내보낼 수있는 공통 ID를 제공하고 나중에 수행 할 작업을 결정합니다.
이미 사용 가능한 솔루션을 많이 검색했지만 종에 대한 프로세스를 하위 집합 (바람직하게는 루프 제외)으로 설정하고 2 + x 관측점에 대한 행을 비교해야한다는 사실에 대해서는 찾지 못했습니다.
놀아야 할 데이터 :
testdata <- structure(list(bird_id = c("20150712_0810_1410_A_1", "20150712_0810_1410_A_2",
"20150712_0810_1410_A_4", "20150712_0810_1410_A_7", "20150727_1115_1430_C_1",
"20150727_1120_1430_B_1", "20150727_1120_1430_B_2", "20150727_1120_1430_B_3",
"20150727_1120_1430_B_4", "20150727_1120_1430_B_5", "20150727_1130_1430_A_2",
"20150727_1130_1430_A_4", "20150727_1130_1430_A_5", "20150812_0900_1225_B_3",
"20150812_0900_1225_B_6", "20150812_0900_1225_B_7", "20150812_0907_1208_A_2",
"20150812_0907_1208_A_3", "20150812_0907_1208_A_5", "20150812_0907_1208_A_6"
), obsPoint = c("A", "A", "A", "A", "C", "B", "B", "B", "B",
"B", "A", "A", "A", "B", "B", "B", "A", "A", "A", "A"), species = structure(c(11L,
11L, 11L, 11L, 10L, 11L, 10L, 11L, 11L, 11L, 11L, 10L, 11L, 11L,
11L, 11L, 11L, 11L, 11L, 11L), .Label = c("Bf", "Fia", "Grr",
"Kch", "Ko", "Lm", "Rm", "Row", "Sea", "Sst", "Wsb"), class = "factor"),
from = structure(c(1436687150, 1436689710, 1436691420, 1436694850,
1437992160, 1437991500, 1437995580, 1437992360, 1437995960,
1437998360, 1437992100, 1437994000, 1437995340, 1439366410,
1439369600, 1439374980, 1439367240, 1439367540, 1439369760,
1439370720), class = c("POSIXct", "POSIXt"), tzone = ""),
to = structure(c(1436687690, 1436690230, 1436691690, 1436694970,
1437992320, 1437992200, 1437995600, 1437992400, 1437996070,
1437998750, 1437992230, 1437994220, 1437996780, 1439366570,
1439370070, 1439375070, 1439367410, 1439367820, 1439369930,
1439370830), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("bird_id",
"obsPoint", "species", "from", "to"), row.names = c("20150712_0810_1410_A_1",
"20150712_0810_1410_A_2", "20150712_0810_1410_A_4", "20150712_0810_1410_A_7",
"20150727_1115_1430_C_1", "20150727_1120_1430_B_1", "20150727_1120_1430_B_2",
"20150727_1120_1430_B_3", "20150727_1120_1430_B_4", "20150727_1120_1430_B_5",
"20150727_1130_1430_A_2", "20150727_1130_1430_A_4", "20150727_1130_1430_A_5",
"20150812_0900_1225_B_3", "20150812_0900_1225_B_6", "20150812_0900_1225_B_7",
"20150812_0907_1208_A_2", "20150812_0907_1208_A_3", "20150812_0907_1208_A_5",
"20150812_0907_1208_A_6"), class = "data.frame")
예를 들어 https : //.com/q/25815032에서 언급 한 data.table 함수 foverlaps를 사용하여 부분 솔루션을 찾았습니다.
library(data.table)
#Subsetting the data for each observation point and converting them into data.tables
A <- setDT(testdata[testdata$obsPoint=="A",])
B <- setDT(testdata[testdata$obsPoint=="B",])
C <- setDT(testdata[testdata$obsPoint=="C",])
#Set a key for these subsets (whatever key exactly means. Don't care as long as it works ;) )
setkey(A,species,from,to)
setkey(B,species,from,to)
setkey(C,species,from,to)
#Generate the match results for each obsPoint/species combination with an overlapping interval
matchesAB <- foverlaps(A,B,type="within",nomatch=0L) #nomatch=0L -> remove NA
matchesAC <- foverlaps(A,C,type="within",nomatch=0L)
matchesBC <- foverlaps(B,C,type="within",nomatch=0L)
물론, 이것은 어떻게 든 "작동"하지만, 실제로 내가 결국 달성하고자하는 것은 아닙니다.
먼저 관측점을 하드 코딩해야합니다. 임의의 수의 포인트를 취하는 솔루션을 찾고 싶습니다.
둘째, 결과는 실제로 쉽게 작업을 재개 할 수있는 형식이 아닙니다. 일치하는 행은 실제로 같은 행에 배치되지만 목표는 행을 아래에 배치하고 새 열에 공통 식별자를 갖는 것입니다.
셋째, 간격이 세 지점 모두에서 겹치는 경우 수동으로 다시 확인해야합니다 (내 데이터에는 해당되지 않지만 일반적으로 가능합니다)
결국, 나는 그룹 ID로 식별 가능한 모든 후보자와 함께 새로운 data.frame을 수신하고 싶습니다.
그래서 더 많은 아이디어를 얻는 방법이 있습니까?
for
루프를 사용하지 않으면 +1합니다 !