ฉันต้องตรวจสอบการสังเกตการณ์ของนกในระยะเวลานานขึ้นเพื่อดูรายการที่ซ้ำกัน / ทับซ้อนกัน
ผู้สังเกตการณ์จากจุดต่าง ๆ (A, B, C) ทำการสังเกตการณ์และทำเครื่องหมายไว้บนแผนที่กระดาษ เส้นเหล่านั้นซึ่งนำมาสู่คุณสมบัติเส้นที่มีข้อมูลเพิ่มเติมสำหรับสปีชีส์จุดสังเกตและช่วงเวลาที่เห็น
โดยปกติผู้สังเกตการณ์จะสื่อสารกันทางโทรศัพท์ในขณะที่สังเกต แต่บางครั้งพวกเขาก็ลืมดังนั้นฉันจึงได้เส้นที่ซ้ำกัน
ฉันลดข้อมูลลงไปเป็นเส้นเหล่านั้นซึ่งแตะวงกลมดังนั้นฉันไม่จำเป็นต้องทำการวิเคราะห์เชิงพื้นที่ แต่เพียงเปรียบเทียบช่วงเวลาสำหรับแต่ละสปีชีส์และมั่นใจได้ว่าเป็นบุคคลเดียวกันที่พบโดยการเปรียบเทียบ .
ตอนนี้ฉันกำลังมองหาวิธีใน R เพื่อระบุรายการเหล่านั้นซึ่ง:
- จะทำในวันเดียวกันกับช่วงเวลาที่ทับซ้อนกัน
- และมันอยู่ที่ไหนสายพันธุ์เดียวกัน
- และซึ่งทำจากจุดสังเกตที่แตกต่างกัน (A หรือ B หรือ C หรือ ... ))
ในตัวอย่างนี้ฉันพบว่ามีรายการที่ซ้ำกันของบุคคลเดียวกัน จุดสังเกตแตกต่างกัน (A <-> B) สปีชีส์เหมือนกัน (Sst) และช่วงเวลาของการเริ่มต้นและสิ้นสุดของเวลาทับซ้อนกัน
ตอนนี้ฉันจะสร้างเขตข้อมูลใหม่ "ทำซ้ำ" ใน data.frame ของฉันโดยให้ทั้งสองแถวมีรหัสทั่วไปเพื่อที่จะสามารถส่งออกและตัดสินใจในภายหลังว่าจะทำอย่างไร
ฉันค้นหาวิธีแก้ปัญหาที่มีอยู่มากมาย แต่ไม่พบว่าเกี่ยวข้องกับความจริงที่ว่าฉันต้องเซตย่อยกระบวนการสำหรับสปีชีส์ (โดยเฉพาะอย่างยิ่งที่ไม่มีลูป) และต้องเปรียบเทียบแถวสำหรับจุดสังเกต 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")
ฉันพบวิธีแก้ปัญหาบางส่วนด้วยฟังก์ชันdata.table foverlaps ที่กล่าวถึงเช่นที่นี่https://stackoverflow.com/q/25815032
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)
แน่นอนว่านี่เป็น "งาน" แต่จริงๆแล้วไม่ใช่สิ่งที่ฉันชอบที่จะประสบความสำเร็จในที่สุด
ก่อนอื่นฉันต้องเขียนโค้ดหนัก ๆ ของจุดสังเกต ฉันต้องการค้นหาวิธีแก้ปัญหาด้วยจำนวนคะแนนโดยพลการ
ประการที่สองผลลัพธ์ไม่ได้อยู่ในรูปแบบที่ฉันสามารถทำงานต่อได้อย่างง่ายดาย จริง ๆ แล้วแถวที่ตรงกันถูกวางไว้ในแถวเดียวกันในขณะที่เป้าหมายของฉันคือการวางแถวไว้ด้านล่างและในคอลัมน์ใหม่พวกเขาจะมีตัวระบุร่วมกัน
ประการที่สามฉันต้องตรวจสอบด้วยตนเองอีกครั้งหากช่วงเวลาซ้อนทับกันจากทั้งสามจุด (ซึ่งไม่ใช่กรณีของข้อมูลของฉัน แต่โดยทั่วไปสามารถทำได้)
ในท้ายที่สุดฉันต้องการรับ data.frame ใหม่กับผู้สมัครทั้งหมดที่ระบุได้โดยรหัสกลุ่มที่ฉันสามารถเข้าร่วมกลับไปที่บรรทัดและส่งออกผลลัพธ์เป็นเลเยอร์สำหรับการตรวจสอบเพิ่มเติม
ดังนั้นใครจะมีแนวคิดเพิ่มเติมวิธีการทำเช่นนี้?
for
ลูป!