Çift / örtüşen girişler için daha uzun bir süre yapılan kuş gözlemlerini kontrol etmeliyim.
Farklı noktalardan (A, B, C) gözlemciler gözlemler yaptılar ve bunları kağıt haritalarda işaretlediler. Bir çizgiye getirilen çizgiler, türler, gözlem noktası ve gördükleri zaman aralıkları için ek veriler içerir.
Normalde, gözlemciler gözlem yaparken birbirleriyle telefon aracılığıyla iletişim kurarlar, ancak bazen unuturlar, bu yüzden o yinelenen hatları alıyorum.
Verileri zaten daireye dokunan çizgilere indirgedim, bu yüzden uzamsal bir analiz yapmak zorunda değilim, ancak sadece her tür için zaman aralıklarını karşılaştırıyorum ve karşılaştırmanın bulduğu ile aynı kişi olduğundan emin olabilirim .
Şimdi R bu girişleri tanımlamak için bir yol arıyorum:
- aynı gün üst üste binen aralıklarla yapılır
- ve aynı türün nerede olduğu
- ve farklı gözlem noktalarından (A veya B veya C veya ...) yapılmış)
Bu örnekte, aynı kişinin muhtemelen yinelenen girişlerini buldum. Gözlem noktası farklıdır (A <-> B), türler aynıdır (Sst) ve başlangıç ve bitiş zamanları aralığı çakışır.
Şimdi benim veri.frame yeni bir alan "yinelenen" oluşturmak, her iki satır onları vermek ve daha sonra ne yapmak karar vermek için ortak bir kimlik vererek.
Zaten mevcut çözümler için çok şey araştırdım, ancak türler için işlemi (tercihen bir döngü olmadan) alt kümeye ayarlamak ve 2 + x gözlem noktaları için satırları karşılaştırmak zorunda olduğumla ilgili bir şey bulamadım.
Oynamak için bazı veriler:
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")
Burada belirtilen data.table işlevi foverlaps ile kısmi bir çözüm buldum 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)
Tabii ki, bu bir şekilde "işe yarıyor", ama sonunda başarmayı sevdiğim şey bu değil.
İlk olarak, gözlem noktalarını zor kodlamalıyım. Rastgele sayıda puan alan bir çözüm bulmayı tercih ederim.
İkincisi, sonuç, kolayca çalışmaya devam edebileceğim bir formatta değil. Eşleşen satırlar aslında aynı satıra yerleştirilirken, hedefim satırların altına konulmasını sağlamak ve yeni bir sütunda ortak bir tanımlayıcıya sahip olmaktır.
Üçüncüsü, üç noktadan da bir aralık çakışıyorsa, tekrar manuel olarak kontrol etmeliyim (verilerimde durum böyle değil, ancak genellikle olabilir)
Sonunda, yeni bir data.frame almak istiyorum, tüm adaylarla grup kimliğiyle tanımlanabilir.
Peki bunun nasıl yapılacağına dair daha fazla fikir olan var mı?
for
döngüler kullanmıyorsa + 1'leyecektir!