दिलचस्प पोस्ट
जावास्क्रिप्ट / जेक्जरी का उपयोग करते हुए वर्ग नाम के आधार पर डीआईवी का क्रम एक्सेस-एसक्यूएल: कई तालिकाओं के साथ आंतरिक सम्मिलित हों jQuery: माउसमोव ईवेंट के दौरान दबाए हुए माउस बटन का पता लगा रहा है अजाक्स क्रॉस डोमेन कॉल जावा में जोड़े या 2-ट्यूपल का उपयोग करना निर्धारित करें कि क्या JSON एक JSONObject या JSONArray है सीए ++ में एक अंतर और एक लंबे समय के बीच अंतर क्या है? दिए गए संभाव्यता matlab के साथ यादृच्छिक संख्या उत्पन्न करें एचटीटीपीआरएल कनेक्शन ने एंड्रॉइड 2.x में ठीक काम किया लेकिन 4.1 में नहीं: कोई प्रमाणीकरण चुनौतियां नहीं मिलीं क्लाइंट रूटिंग (रिएक्शन-राउटर का उपयोग करके) और सर्वर साइड रूटिंग यादृच्छिक एनोटेशन के कारण रनटाइम पर क्लास नोफ्फ़एक्सएपशन का कारण नहीं है? डॉकर मशीन में स्थानीय संस्करणों को कैसे माउंट करने के लिए रनटाइम पर कस्टम फ़ाइल में प्रवेश करने के लिए log4j कॉन्फ़िगर करें जावा में एक तारीख को दिन जोड़ना जावास्क्रिप्ट "resizeTo" फ़ंक्शन क्रोम और ओपेरा में काम नहीं कर रहा है

कंजनी का तेज़ संस्करण

वेक्टर से ली गई 2 तत्वों के सभी अनूठे संयोजनों को प्राप्त करने के लिए combn कमांड को गति देने का एक तरीका है?

आमतौर पर यह इस तरह स्थापित किया जाएगा:

 # Get latest version of data.table library(devtools) install_github("Rdatatable/data.table", build_vignettes = FALSE) library(data.table) # Toy data d <- data.table(id=as.character(paste0("A", 10001:15000))) # Transform data system.time({ d.1 <- as.data.table(t(combn(d$id, 2))) }) 

हालांकि, combn 10 बार धीमा है (23 सेकेंड बनाम मेरे कंप्यूटर पर 3 सेकंड) डेटाटाइव का उपयोग करके सभी संभव संयोजनों की गणना की तुलना में।

 system.time({ d.2 <- d[, list(neighbor=d$id[-which(d$id==id)]), by=c("id")] }) 

बहुत बड़े वैक्टर से निपटने के लिए, मैं अनूठे संयोजनों (जैसे combn ) की गणना के द्वारा स्मृति को बचाने के लिए एक रास्ता खोज रहा हूं, लेकिन डेटा की गति के साथ (दूसरे कोड स्निपेट देखें)।

मैं किसी भी मदद की सराहना करता हूँ

वेब के समाधान से एकत्रित समाधान "कंजनी का तेज़ संस्करण"

आप combnPrim से gRbase उपयोग कर सकते हैं

 source("http://bioconductor.org/biocLite.R") biocLite("gRbase") # will install dependent packages automatically. system.time({ d.1 <- as.data.table(t(combn(d$id, 2))) }) # user system elapsed # 27.322 0.585 27.674 system.time({ d.2 <- as.data.table(t(combnPrim(d$id,2))) }) # user system elapsed # 2.317 0.110 2.425 identical(d.1[order(V1, V2),], d.2[order(V1,V2),]) #[1] TRUE 

यहां एक तरीका है जो data.table फ़ंक्शन foverlaps() का उपयोग करता है, जो कि तेजी से निकलता है!

 require(data.table) ## 1.9.4+ d[, `:=`(id1 = 1L, id2 = .I)] ## add interval columns for overlaps setkey(d, id1, id2) system.time(olaps <- foverlaps(d, d, type="within", which=TRUE)[xid != yid]) # 0.603 0.062 0.717 

ध्यान दें कि foverlaps() सभी क्रमपरिवर्तनों की गणना नहीं करता हैस्वयं ओवरलैप को हटाने के लिए सबसेट xid != yid की आवश्यकता है सबसेट को आंतरिक रूप से ignoreSelf को लागू करके और अधिक कुशलतापूर्वक संभाला जा सकता है ignoreSelf तर्क – IRanges::findOverlaps समान

अब एड्स का उपयोग करते हुए एक सबसेट का प्रदर्शन करने का मामला है:

 system.time(ans <- setDT(list(d$id[olaps$xid], d$id[olaps$yid]))) # 0.576 0.047 0.662 

तो पूरी तरह से, ~ 1.4 सेकंड।


इसका फायदा यह है कि आप उसी तरीके से भी कर सकते हैं, भले ही आपके डेटाटाइबल d में 1 से अधिक कॉलम हो, जिनके लिए आपको संयोजन मिलना है, और इसी तरह की स्मृति का प्रयोग करना है (जब से हम सूचकांक लौटते हैं)। उस स्थिति में, आप बस करते हैं:

 cbind(d[olaps$xid, your_cols, with=FALSE], d[olaps$yid, your_cols, with=FALSE]) 

लेकिन यह सिर्फ combn(., 2L) जगह करने के लिए सीमित है। 2 एल से अधिक नहीं

यहां आरसीपीपी का उपयोग कर एक समाधान है।

 library(Rcpp) library(data.table) cppFunction(' Rcpp::DataFrame combi2(Rcpp::CharacterVector inputVector){ int len = inputVector.size(); int retLen = len * (len-1) / 2; Rcpp::CharacterVector outputVector1(retLen); Rcpp::CharacterVector outputVector2(retLen); int start = 0; for (int i = 0; i < len; ++i){ for (int j = i+1; j < len; ++j){ outputVector1(start) = inputVector(i); outputVector2(start) = inputVector(j); ++start; } } return(Rcpp::DataFrame::create(Rcpp::Named("id") = outputVector1, Rcpp::Named("neighbor") = outputVector2)); }; ') # Toy data d <- data.table(id=as.character(paste0("A", 10001:15000))) system.time({ d.2 <- d[, list(neighbor=d$id[-which(d$id==id)]), by=c("id")] }) # 1.908 0.397 2.389 system.time({ d[, `:=`(id1 = 1L, id2 = .I)] ## add interval columns for overlaps setkey(d, id1, id2) olaps <- foverlaps(d, d, type="within", which=TRUE)[xid != yid] ans <- setDT(list(d$id[olaps$xid], d$id[olaps$yid])) }) # 0.653 0.038 0.705 system.time(ans2 <- combi2(d$id)) # 1.377 0.108 1.495 

सूचकांक प्राप्त करने के लिए आरसीपीपी फ़ंक्शन का उपयोग करना और फिर डेटाटाइटेबल बनाना, बेहतर काम करता है

 cppFunction(' Rcpp::DataFrame combi2inds(const Rcpp::CharacterVector inputVector){ const int len = inputVector.size(); const int retLen = len * (len-1) / 2; Rcpp::IntegerVector outputVector1(retLen); Rcpp::IntegerVector outputVector2(retLen); int indexSkip; for (int i = 0; i < len; ++i){ indexSkip = len * i - ((i+1) * i)/2; for (int j = 0; j < len-1-i; ++j){ outputVector1(indexSkip+j) = i+1; outputVector2(indexSkip+j) = i+j+1+1; } } return(Rcpp::DataFrame::create(Rcpp::Named("xid") = outputVector1, Rcpp::Named("yid") = outputVector2)); }; ') system.time({ indices <- combi2inds(d$id) ans2 <- setDT(list(d$id[indices$xid], d$id[indices$yid])) }) # 0.389 0.027 0.425