আর-তে আরও দুটি মানদণ্ডের সাথে ওভারল্যাপিং সময়ের ব্যবধানগুলি চিহ্নিত করা হচ্ছে?


10

সদৃশ / ওভারল্যাপিং এন্ট্রিগুলির জন্য আমাকে দীর্ঘ সময়ের জন্য পাখির পর্যবেক্ষণগুলি পরীক্ষা করতে হবে।

বিভিন্ন পয়েন্ট (এ, বি, সি) থেকে পর্যবেক্ষকরা পর্যবেক্ষণ করেছেন এবং সেগুলি কাগজের মানচিত্রে চিহ্নিত করেছেন। সেই লাইনগুলি যেখানে প্রজাতিগুলির জন্য অতিরিক্ত ডেটা, পর্যবেক্ষণ বিন্দু এবং সময় ব্যবধানগুলি দেখা হয়েছিল তাদের একটি লাইন বৈশিষ্ট্য এনেছে।

সাধারণত পর্যবেক্ষকরা পর্যবেক্ষণ করার সময় ফোনের মাধ্যমে একে অপরের সাথে যোগাযোগ করেন তবে কখনও কখনও তারা ভুলে যায়, তাই আমি সেই অনুলিপিগুলি পাই।

আমি ইতিমধ্যে সেই বৃত্তগুলিকে স্পর্শকারী রেখাগুলিতে ডেটা হ্রাস করেছি, সুতরাং আমাকে একটি স্থানিক বিশ্লেষণ করতে হবে না, তবে প্রতিটি প্রজাতির জন্য কেবল সময়ের ব্যবধানের তুলনা করতে হবে এবং তুলনামূলকভাবে এটি একই ব্যক্তি হিসাবে পাওয়া যায় তা নিশ্চিত হতে পারে ।

আমি এখন আরগুলিতে সেই প্রবেশগুলি সনাক্ত করার জন্য একটি উপায় খুঁজছি যা:

  • ওভারল্যাপিং অন্তর দিয়ে একই দিনে তৈরি করা হয়
  • এবং যেখানে এটি একই প্রজাতি
  • এবং যা বিভিন্ন পর্যবেক্ষণ পয়েন্টগুলি থেকে তৈরি হয়েছিল (এ বা বি বা সি বা ...))

এখানে চিত্র বর্ণনা লিখুন

এই উদাহরণে, আমি ম্যানুয়ালি একই ব্যক্তির সম্ভবত নকল এন্ট্রি পেয়েছি। পর্যবেক্ষণের পয়েন্টটি আলাদা (এ <-> বি), প্রজাতিগুলি একই (এসএসটি) এবং শুরু এবং শেষ সময়ের ব্যবধানটি ওভারল্যাপ হয়।

এখানে চিত্র বর্ণনা লিখুন

আমি এখন আমার ডেটা ফ্রেমে একটি নতুন ক্ষেত্র "ডুপ্লিকেট" তৈরি করব, উভয় সারিকে একটি সাধারণ আইডি দিয়ে রফতানি করতে সক্ষম হবো এবং পরে কী করব তা সিদ্ধান্ত নেবে।

আমি ইতিমধ্যে উপলভ্য সমাধানগুলির জন্য প্রচুর অনুসন্ধান করেছি, তবে প্রজাতির জন্য প্রক্রিয়াটি (সাবধানে একটি লুপ ছাড়াই) সাবসেট করতে হবে এবং 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)

অবশ্যই, এটি কোনওভাবে "কাজ করে" তবে শেষ পর্যন্ত আমি যা অর্জন করতে চাই তা সত্য নয়।

প্রথমত, আমাকে পর্যবেক্ষণের পয়েন্টগুলি হার্ড কোড করতে হবে। আমি একটি ইচ্ছামত সংখ্যক পয়েন্ট নিয়ে একটি সমাধান খুঁজে পেতে চাই।

দ্বিতীয়ত, ফলাফলটি এমন বিন্যাসে নয় যা আমি খুব সহজেই সহজেই কাজ শুরু করতে পারি। মিলে যাওয়া সারিগুলি আসলে একই সারিতে রাখা হয়, তবে আমার লক্ষ্যটি সারিগুলির নীচে রাখা এবং একটি নতুন কলামে, তাদের একটি সাধারণ শনাক্তকারী থাকবে।

তৃতীয়, আমাকে আবারও ম্যানুয়ালি যাচাই করতে হবে, যদি তিনটি পয়েন্ট থেকে কোনও অন্তর ওভারল্যাপ হয়ে যায় (যা আমার ডেটাতে হয় না তবে সাধারণত পারে)

শেষ পর্যন্ত, আমি কেবল একটি গ্রুপ আইডি দ্বারা চিহ্নিত সমস্ত প্রার্থীদের সাথে একটি নতুন ডেটা ফ্রেম পেতে চাই যে আমি লাইনে ফিরে যেতে পারব এবং ফলাফলটি আরও পরীক্ষার জন্য স্তর হিসাবে রফতানি করতে পারব।

তাহলে আর কারও ধারণা কীভাবে এটি করা যায়?


আমি নিশ্চিত যে আমি পুরোপুরি বুঝতে পেরেছি না, তবে পোস্টগ্র্রেএসকিউএল এ মোটামুটি সোজা এগিয়ে যাওয়ার মতো কাজটি মনে হচ্ছে। সময়সীমা জন্য ফাংশন আছে। যেহেতু আমি বুঝতে পেরেছি পোস্টগ্রেএসকিউএল এবং আর এর মধ্যে ডেটা ভাগ করা সহজ হওয়া উচিত
নিক্লাস অ্যাভন

আমাকে স্বীকার করতে হবে পোস্টগ্রিস সম্পর্কে আমার শূন্য জ্ঞান নেই, তবে প্রকৃতপক্ষে, আজ সন্ধ্যায় বিয়ার পান করার সময়, আমারও ধারণা ছিল যে এর জন্য কিছু বর্গফুট জিনিস উপলভ্য হতে পারে। আমার বাকী অপারেশনগুলির জন্য আমাকে ডেটাসেটের সাথে করতে হবে, যদিও এটি হাতিয়ার, তবে আমি জানি যে এসকিএল ফাংশনগুলি কিছু প্যাকেজের মাধ্যমে আর এর মধ্যেও সম্পাদন করা যায়। তদন্ত করা হচ্ছে ....
বারেন্ড ভি।

ডেটাসেটটি কত বড় - শত, হাজার, মিলিয়ন সারি? এসকিউএল ফাংশনগুলির জন্য আপনি কি sqldf খুঁজে পেয়েছেন ?
সিম্বামাঙ্গু

ইতিমধ্যে আমি একটি কার্যকরী সমাধান খুঁজে পেয়েছি। আমার লজ্জা আমি এ পর্যন্ত পোস্ট করি নি। অন্যদের ব্যবহারের জন্য এটি আরও সাধারণ করে তুলতে হবে এবং তারপরে আমি এটিকে তাত্পর্যপূর্ণ পোস্ট করব।
বারেন্ড ভি।

এটি যদি সমস্ত ভেক্টরাইজড থাকে এবং forলুপগুলি ব্যবহার না করে তবে এটি +1 করবে !
সিম্বামাঙ্গু

উত্তর:


1

কিছু মন্তব্যকারীদের ইঙ্গিত হিসাবে, এসকিউএল জটিল সীমাবদ্ধতার পরিবর্তে জটিল সেট প্রকাশ করার জন্য একটি ভাল বিকল্প। Sqldf প্যাকেজ এটা সহজ নিজেকে একটি রিলেশনাল ডাটাবেস সেট আপ করার ছাড়াই আর এসকিউএল এর ক্ষমতা ব্যবহার করে তোলে।

এসকিউএল ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে। দৌড়ানোর আগে, আমাকে আপনার ডেটার ব্যবধান কলামগুলিতে নতুন নামকরণ করতে হয়েছিল startTimeএবং endTimeকারণটি fromএসকিউএল-এ সংরক্ষিত রয়েছে।

library(reshape2)
library(sqldf)

dupes_wide <- sqldf("SELECT hex(randomblob(16)) dupe_id, x.bird_id x_bird_id, y.bird_id y_bird_id
                     FROM testdata x JOIN testdata y
                          ON (x.startTime <= y.endTime)
                         AND (x.endTime >= y.startTime)
                         AND (x.species = y.species)
                         AND (x.obsPoint < y.obsPoint)")
dupes_long <- melt(dupes_wide, id.vars='dupe_id', value.name='bird_id')
merge(testdata, dupes_long[, c('dupe_id', 'bird_id')], by='bird_id', all.x=TRUE)

বুঝতে সহায়তা করার জন্য, এসকিউএল প্রতিক্রিয়াটি dupes_wideএর মতো দেখতে শেষ হবে:

                         দুপ_আইডি x_ বার্ড_আইডি y_bird_id
253FCC7A58FD8401960FC5D95153356C 20150727_1130_1430_A_2 20150727_1120_1430_B_1
9C1C1A13306ECC2DF78004D421F70CE6 20150727_1130_1430_A_5 20150727_1120_1430_B_4
1E8316DBF631BBF6D2CCBD15A85E6EF3 20150812_0907_1208_A_5 20150812_0900_1225_B_6

স্ব-যোগদান FROM testdata x JOIN testdata y : একটি ডেটাসেট থেকে সারি জোড়া সন্ধান করা একটি স্ব-যোগদান। আমাদের প্রতিটি সারি প্রত্যেকটি অন্যের সাথে তুলনা করা দরকার। ONঅভিব্যক্তি জোড়া রাখার জন্য সীমাবদ্ধতার তালিকাবদ্ধ করে।

ওভারল্যাপিং ব্যবধান : আমি নিশ্চিত যে এই এসকিউএল ( উত্স ) এ আমি ব্যবহার করা ওভারল্যাপের সংজ্ঞাটি আপনার জন্য যা foverlapsকরছে তার থেকে পৃথক । আপনি "অভ্যন্তর" প্রকারটি ব্যবহার করেছেন, যার জন্য পূর্ববর্তী পর্যবেক্ষণটি obsPointপুরোপুরি পর্যবেক্ষণের মধ্যে পরবর্তী সময়ে হওয়া প্রয়োজন obsPoint(তবে এটি বিপরীতে মিস করে, যেমন সি এর পর্যবেক্ষণ পুরোপুরি বি এর মধ্যে থাকে)। ভাগ্যক্রমে এসকিউএল এ এটি সহজ যদি আপনার ওভারল্যাপের একটি পৃথক সংজ্ঞা এনকোড করতে হয়।

বিভিন্ন পয়েন্ট : আপনার সীমাবদ্ধতা যে নকলগুলি বিভিন্ন পর্যবেক্ষণ পয়েন্ট থেকে তৈরি করা হয়েছিল তা সত্যই প্রকাশ করা হবে (x.obsPoint <> y.obsPoint)। আমি যদি এটি টাইপ করি, এসকিউএল প্রতিটি ডুপ্লিকেটযুক্ত জোড়াকে দু'বার ফিরে আসবে, পাখিগুলি প্রতিটি সারিতে ক্রম পরিবর্তন করে। পরিবর্তে আমি <সারিগুলির অনন্য অর্ধেক রাখার জন্য একটি ব্যবহার করেছি । (এটি করার একমাত্র উপায় নয়)

স্বতন্ত্র সদৃশ আইডি : আপনার পূর্ববর্তী সমাধানের মতো, এসকিউএল নিজেই একই সারিতে নকলকে তালিকাবদ্ধ করে। প্রতিটি জুটির জন্য অনন্য আইডি তৈরির জন্য hex(randomblob(16))এসকিউএলাইটে একটি হ্যাকি ( এখনও প্রস্তাবিত ) উপায়।

আউটপুট ফর্ম্যাট : আপনি একই সারিতে থাকা সদৃশ পছন্দ করেন নি, তাই meltএগুলি বিভক্ত করুন এবং mergeডুপ্লিকেট আইডিগুলি আপনার প্রাথমিক ডেটা ফ্রেমে ফিরিয়ে দিন।

সীমাবদ্ধতা : যেখানে একই পাখি দুটিরও বেশি ট্র্যাকে ধরা পড়েছে সে ক্ষেত্রে আমার দ্রবণটি পরিচালনা করে না । এটি কৌশলযুক্ত এবং কিছুটা খারাপ সংজ্ঞায়িত ill উদাহরণস্বরূপ, যদি তাদের সময়সীমা দেখতে ভালো লাগে

    | - পাখি 1 - |
             | - পাখি 2 - |
                      | - পাখি 3 - |

তারপরে পাখি 1 হ'ল বার্ড 2 এর নকল , যা বার্ড 3 এর সদৃশ , তবে কি বার্ড 1 এবং বার্ড 3 নকল?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.