2012-05-19 16 views
5

एसओ (LINK) पर एक प्रश्न में एक पोस्टर ने एक प्रश्न पूछा और मैंने एक जवाब दिया जो काम करता है लेकिन एक ऐसा हिस्सा है जो मुझे बग करता है, एक वेक्टर से list को सूची के रूप में पास करने के लिए बनाता है सूचकांक तो लेस कहते हैं कि मैं इस सदिश है:बराबर लंबाई वाले वैक्टरों की एक सूची बनाएं

n <- 1:10 
#> n 
# [1] 1 2 3 4 5 6 7 8 9 10 

चलो कहते हैं कि मैं इसे तोड़ने के लिए वैक्टर की एक सूची में चाहते हैं और प्रत्येक वेक्टर लंबाई 3. क्या सबसे अच्छा तरीका (कोड & या सबसे तेजी से कम से कम राशि) है की है इसे पूरा करो? हम आइटम 10 को टॉस करना चाहते हैं क्योंकि इसमें 10/3 (length(n) - 10 %% 3) से शेष 1 (10 %% 3) है।

यह वांछित परिणाम है

list(1:3, 4:6, 7:9) 

यह हमें उन के सूचकांकों कि तीन में से एक समूह नहीं कर सकते हैं दे देंगे:

(length(n) + 1 - 10 %% 3):length(n) 

संपादित

यहाँ एक है other thread पर वोज्शिएक सोबाला द्वारा पोस्ट किया गया दिलचस्प दृष्टिकोण यह जुड़ा हुआ है (मैंने उनसे जवाब देने के लिए कहा और यदि वे करते हैं तो मैं टी को हटा दूंगा उसके संपादित)

n <- 100 
l <- 3 
n2 <- n - (n %% l) 
split(1:n2, rep(1:n2, each=l, length=n2)) 

एक समारोह के रूप में:

indices <- function(n, l){ 
    if(n > l) stop("n needs to be smaller than or equal to l") 
    n2 <- n - (n %% l) 
    cat("numbers", (n + 1 - n %% l):n, "did not make an index of length", l) 
    split(1:n2, rep(1:n2, each=l, length=n2)) 
} 
+0

सभी महान जवाब लेकिन मुझे लगता है एक्स , वह सबसे छोटा कोड-वार है। धन्यवाद, वह मुझे परेशान कर रहा था। मैं जो कर रहा था उससे कहीं ज्यादा बेहतर दृष्टिकोण। –

उत्तर

5

सुनिश्चित नहीं हैं कि अगर यह काम करता है?

x = function(x, n){ 
    if(n > x) stop("n needs to be smaller than or equal to x") 
    output = matrix(1:(x-x%%n), ncol=(x-x%%n)/n, byrow=FALSE) 
    output 
} 

संपादित करें: एक सूची

x = function(x, n){ 
    if(n > x) stop("n needs to be smaller than or equal to x") 
    output = matrix(1:(x-x%%n), ncol=(x-x%%n)/n, byrow=TRUE) 
    split(output, 1:nrow(output)) 
} 

Example: 
x(10, 3) 
$`1` 
[1] 1 2 3 

$`2` 
[1] 4 5 6 

$`3` 
[1] 7 8 9 
+0

बहुत आसान है। +1 –

+0

@ टायलर-रिंकर हालांकि मुझे यकीन नहीं है कि यह तेज़ है ... – Alex

+0

यह एक सूची नहीं है, हालांकि यह उस पोस्टर के प्रश्न में तब तक काम नहीं करेगा जब तक कि आप 'output' को 'data.frame' –

4
xx <- 1:10 
xxr <- rle(0:(length(1:10)-1) %/% 3) # creates an rle object 
fac3 <- rep(xxr$values[xxr$lengths == 3], each=3) #selects the one of length 3 
            # and recreates the shortened grouping vector 
tapply(xx[ 1:length(fac3)],   # a shortened original vector 
         fac3, list) # split into little lists 
$`0`        # Hope you don't mind having names on your list 
[1] 1 2 3 

$`1` 
[1] 4 5 6 

$`2` 
[1] 7 8 9 
+0

मैंने वास्तव में आपकी प्रतिक्रिया को संपादित नहीं किया था, बस गलत संपादन, क्षमा में अपना संपादन डाला। +1 –

3

यह कम से कम नहीं है, लेकिन यहां एक छोटे से पुनरावर्ती संस्करण है करने के लिए उत्पादन बदल दिया है:

wrap <- function(n,x,lx,y) { 
    if (lx < n) return (y) 
    z <- x[-(1:n)] 
    wrap(n, z, length(z), c(y, list(x[1:n]))) 
} 

wrapit <- function(x,n) { 
    wrap(n,x,length(x),list()) 
} 

> wrapit(1:10,3) 
[[1]] 
[1] 1 2 3 

[[2]] 
[1] 4 5 6 

[[3]] 
[1] 7 8 9 
+0

वाह यह मेरा नूडल दर्द होता है। +1 मुझे यह भी यकीन नहीं है कि यह कैसे काम करता है (हालांकि सूचकांक रिवर्स ऑर्डर में हैं) –

+1

रिकर्सिव फ़ंक्शंस को समझने के लिए, कभी-कभी पेपर और पेंसिल के साथ फ़ंक्शन कॉल की श्रृंखला का पालन करने में सहायता मिल सकती है। या सूची बढ़ने और वेक्टर सिकुड़ने के लिए वहां कुछ प्रिंट स्टेटमेंट डालें। –

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