Tôi phải kiểm tra các quan sát chim được thực hiện trong một khoảng thời gian dài hơn cho các mục trùng lặp / chồng chéo.
Các quan sát viên từ các điểm khác nhau (A, B, C) đã quan sát và đánh dấu chúng trên bản đồ giấy. Những dòng được đưa vào một tính năng dòng với dữ liệu bổ sung cho loài, điểm quan sát và khoảng thời gian chúng được nhìn thấy.
Thông thường, các nhà quan sát giao tiếp với nhau qua điện thoại trong khi quan sát, nhưng đôi khi họ quên, vì vậy tôi nhận được những dòng trùng lặp đó.
Tôi đã giảm dữ liệu xuống các dòng chạm vào vòng tròn, vì vậy tôi không phải phân tích không gian, mà chỉ so sánh các khoảng thời gian cho mỗi loài và có thể khá chắc chắn rằng đó là cùng một cá thể được tìm thấy bằng cách so sánh .
Bây giờ tôi đang tìm cách trong R để xác định các mục đó:
- được thực hiện trong cùng một ngày với một khoảng thời gian chồng chéo
- và nơi nó là cùng một loài
- và được tạo từ các điểm quan sát khác nhau (A hoặc B hoặc C hoặc ...))
Trong ví dụ này, tôi tìm thấy thủ công các mục có thể trùng lặp của cùng một cá nhân. Điểm quan sát là khác nhau (A <-> B), các loài là như nhau (Sst) và khoảng thời gian bắt đầu và kết thúc trùng nhau.
Bây giờ tôi sẽ tạo một trường mới "trùng lặp" trong data.frame của mình, cung cấp cho cả hai hàng một id chung để có thể xuất chúng và sau đó quyết định xem phải làm gì.
Tôi đã tìm kiếm rất nhiều giải pháp đã có sẵn, nhưng không tìm thấy bất kỳ điều gì liên quan đến thực tế là tôi phải đặt lại quy trình cho loài (tốt nhất là không có vòng lặp) và phải so sánh các hàng cho các điểm quan sát 2 + x.
Một số dữ liệu để chơi xung quanh:
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")
Tôi đã tìm thấy một giải pháp một phần với các hàm foverlaps của hàm data.table được đề cập, ví dụ ở đây /programming//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)
Tất nhiên, điều này bằng cách nào đó "hoạt động", nhưng thực sự không phải là điều tôi muốn đạt được cuối cùng.
Đầu tiên, tôi phải cứng mã các điểm quan sát. Tôi muốn tìm một giải pháp lấy một số điểm tùy ý.
Thứ hai, kết quả không ở định dạng mà tôi thực sự có thể tiếp tục làm việc dễ dàng. Các hàng khớp thực sự được đặt VÀO cùng một hàng, trong khi mục tiêu của tôi là đặt các hàng bên dưới và trong một cột mới, chúng sẽ có một định danh chung.
Thứ ba, tôi phải kiểm tra lại một cách thủ công, nếu một khoảng trùng lặp từ cả ba điểm (không đúng với dữ liệu của tôi, nhưng nói chung là có thể)
Cuối cùng, tôi chỉ muốn nhận một dữ liệu mới. Trò chơi với tất cả các ứng cử viên được nhận dạng bởi một id nhóm mà tôi có thể tham gia trở lại các dòng và xuất kết quả dưới dạng một lớp để kiểm tra thêm.
Vì vậy, bất cứ ai có thêm ý tưởng làm thế nào để làm điều này?
for
các vòng lặp!