2012-08-20 13 views
14

इंटरलस मैं एक ही मोड और बराबर लंबाई के दो वैक्टरों को जोड़ना चाहता हूं। कहते हैं:वैकल्पिक, इंटरवेव या दो वैक्टर

a <- rpois(lambda=3,n=5e5) 
b <- rpois(lambda=4,n=5e5) 

मैं एक दूसरे से लिपटना या जिल्द इन दो वैक्टर, एक सदिश कि होगा बनाने के लिए चाहते हैं समतुल्य रूप c(a[1],b[1],a[2],b[2],...,a[length(a)],b[length(b)])

मेरा पहला प्रयास था यह:

sapply(X=rep.int(c(3,4),times=5e5),FUN=rpois,n=1) 

लेकिन यह rpois की आवश्यकता है जरूरत से कहीं ज्यादा बार कहा जा सकता है।

मेरे सबसे अच्छे प्रयास अब तक यह एक मैट्रिक्स में बदलना और एक सदिश में वापस reconvert किया गया है:

d <- c(rbind(rpois(lambda=3,n=5e5),rpois(lambda=4,n=5e5))) 
d <- c(rbind(a,b)) 

वहाँ यह करने के बारे में जाने के लिए एक बेहतर तरीका है? या आधार R में कोई फ़ंक्शन है जो एक ही चीज़ को पूरा करता है?

+0

आप कृपया सवाल से जवाब के तत्वों को दूर कर सकते हैं? यदि आप प्रश्न में अपने प्रश्न का उत्तर देते हैं तो यह बहुत भ्रमित हो जाता है। आप @benbolker का उत्तर संपादित कर सकते हैं, या आप एक नया उत्तर पोस्ट कर सकते हैं। – Andrie

+0

@Andrie हो गया। उसके लिए माफ़ करना। –

उत्तर

13

आपकी rbind विधि अच्छी तरह से काम करनी चाहिए। आप

rpois(lambda=c(3,4),n=1e6) 

क्योंकि आर स्वचालित रूप से आवश्यक लंबाई तक लैम्ब्डा मानों के वेक्टर को दोहराएगा। वहाँ बहुत अंतर गति में नहीं है:

library(rbenchmark) 
benchmark(rpois(1e6,c(3,4)), 
    c(rbind(rpois(5e5,3),rpois(5e5,4)))) 


#          test replications elapsed relative 
# 2 c(rbind(rpois(5e+05, 3), rpois(5e+05, 4)))   100 23.390 1.112168 
# 1      rpois(1e+06, c(3, 4))   100 21.031 1.000000 

और लालित्य, देखने वाले ... ज़ाहिर है, c(rbind(...)) विधि बारी वैक्टर के निर्माण के लिए सामान्य रूप में काम करता है की आंखों में है, जबकि अन्य समाधान rpois या अन्य के लिए विशिष्ट है ऐसे कार्य जो उनके तर्कों को इस तरह से दोहराते हैं।

+0

ओह वाह, यह मेरे लिए कभी नहीं हुआ। मैं 'आर में सोचने' से पहले जाने का एक तरीका है। धन्यवाद! –

3

कुछ गति परीक्षण, बेन Bolker के जवाब शामिल:

> benchmark(
+ c(rbind(rpois(lambda=3,n=5e5),rpois(lambda=4,n=5e5))), 
+ c(t(sapply(X=list(3,4),FUN=rpois,n=5e5))), 
+ sapply(X=rep.int(c(3,4),times=5e5),FUN=rpois,n=1), 
+ rpois(lambda=c(3,4),n=1e6), 
+ rpois(lambda=rep.int(c(3,4),times=5e5),n=1e6) 
+) 
                    test 
1 c(rbind(rpois(lambda = 3, n = 5e+05), rpois(lambda = 4, n = 5e+05))) 
2     c(t(sapply(X = list(3, 4), FUN = rpois, n = 5e+05))) 
4         rpois(lambda = c(3, 4), n = 1e+06) 
5   rpois(lambda = rep.int(c(3, 4), times = 5e+05), n = 1e+06) 
3  sapply(X = rep.int(c(3, 4), times = 5e+05), FUN = rpois, n = 1) 
    replications elapsed relative user.self sys.self user.child sys.child 
1   100 6.14 1.000000  5.93  0.15   NA  NA 
2   100 7.11 1.157980  7.02  0.02   NA  NA 
4   100 14.09 2.294788  13.61  0.05   NA  NA 
5   100 14.24 2.319218  13.73  0.21   NA  NA 
3   100 700.84 114.143322 683.51  0.50   NA  NA 
+0

मैं यह देखने के लिए बहुत चौंक गया हूं कि 'rbind' कमांड यहां कितना अच्छा काम करता है। मुझे याद है कि आरबीआईंड और cbind का मेमोरी gobblers के रूप में बहुत दृढ़ता से विरोध ... – AdamO

संबंधित मुद्दे