সদৃশ / ওভারল্যাপিং এন্ট্রিগুলির জন্য আমাকে দীর্ঘ সময়ের জন্য পাখির পর্যবেক্ষণগুলি পরীক্ষা করতে হবে।
বিভিন্ন পয়েন্ট (এ, বি, সি) থেকে পর্যবেক্ষকরা পর্যবেক্ষণ করেছেন এবং সেগুলি কাগজের মানচিত্রে চিহ্নিত করেছেন। সেই লাইনগুলি যেখানে প্রজাতিগুলির জন্য অতিরিক্ত ডেটা, পর্যবেক্ষণ বিন্দু এবং সময় ব্যবধানগুলি দেখা হয়েছিল তাদের একটি লাইন বৈশিষ্ট্য এনেছে।
সাধারণত পর্যবেক্ষকরা পর্যবেক্ষণ করার সময় ফোনের মাধ্যমে একে অপরের সাথে যোগাযোগ করেন তবে কখনও কখনও তারা ভুলে যায়, তাই আমি সেই অনুলিপিগুলি পাই।
আমি ইতিমধ্যে সেই বৃত্তগুলিকে স্পর্শকারী রেখাগুলিতে ডেটা হ্রাস করেছি, সুতরাং আমাকে একটি স্থানিক বিশ্লেষণ করতে হবে না, তবে প্রতিটি প্রজাতির জন্য কেবল সময়ের ব্যবধানের তুলনা করতে হবে এবং তুলনামূলকভাবে এটি একই ব্যক্তি হিসাবে পাওয়া যায় তা নিশ্চিত হতে পারে ।
আমি এখন আরগুলিতে সেই প্রবেশগুলি সনাক্ত করার জন্য একটি উপায় খুঁজছি যা:
- ওভারল্যাপিং অন্তর দিয়ে একই দিনে তৈরি করা হয়
- এবং যেখানে এটি একই প্রজাতি
- এবং যা বিভিন্ন পর্যবেক্ষণ পয়েন্টগুলি থেকে তৈরি হয়েছিল (এ বা বি বা সি বা ...))
এই উদাহরণে, আমি ম্যানুয়ালি একই ব্যক্তির সম্ভবত নকল এন্ট্রি পেয়েছি। পর্যবেক্ষণের পয়েন্টটি আলাদা (এ <-> বি), প্রজাতিগুলি একই (এসএসটি) এবং শুরু এবং শেষ সময়ের ব্যবধানটি ওভারল্যাপ হয়।
আমি এখন আমার ডেটা ফ্রেমে একটি নতুন ক্ষেত্র "ডুপ্লিকেট" তৈরি করব, উভয় সারিকে একটি সাধারণ আইডি দিয়ে রফতানি করতে সক্ষম হবো এবং পরে কী করব তা সিদ্ধান্ত নেবে।
আমি ইতিমধ্যে উপলভ্য সমাধানগুলির জন্য প্রচুর অনুসন্ধান করেছি, তবে প্রজাতির জন্য প্রক্রিয়াটি (সাবধানে একটি লুপ ছাড়াই) সাবসেট করতে হবে এবং 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)
অবশ্যই, এটি কোনওভাবে "কাজ করে" তবে শেষ পর্যন্ত আমি যা অর্জন করতে চাই তা সত্য নয়।
প্রথমত, আমাকে পর্যবেক্ষণের পয়েন্টগুলি হার্ড কোড করতে হবে। আমি একটি ইচ্ছামত সংখ্যক পয়েন্ট নিয়ে একটি সমাধান খুঁজে পেতে চাই।
দ্বিতীয়ত, ফলাফলটি এমন বিন্যাসে নয় যা আমি খুব সহজেই সহজেই কাজ শুরু করতে পারি। মিলে যাওয়া সারিগুলি আসলে একই সারিতে রাখা হয়, তবে আমার লক্ষ্যটি সারিগুলির নীচে রাখা এবং একটি নতুন কলামে, তাদের একটি সাধারণ শনাক্তকারী থাকবে।
তৃতীয়, আমাকে আবারও ম্যানুয়ালি যাচাই করতে হবে, যদি তিনটি পয়েন্ট থেকে কোনও অন্তর ওভারল্যাপ হয়ে যায় (যা আমার ডেটাতে হয় না তবে সাধারণত পারে)
শেষ পর্যন্ত, আমি কেবল একটি গ্রুপ আইডি দ্বারা চিহ্নিত সমস্ত প্রার্থীদের সাথে একটি নতুন ডেটা ফ্রেম পেতে চাই যে আমি লাইনে ফিরে যেতে পারব এবং ফলাফলটি আরও পরীক্ষার জন্য স্তর হিসাবে রফতানি করতে পারব।
তাহলে আর কারও ধারণা কীভাবে এটি করা যায়?
for
লুপগুলি ব্যবহার না করে তবে এটি +1 করবে !