2012-05-19 6 views
5

ここではSO(LINK)のポスターが質問をしてくれました。答えはありましたが、バグの部分があります。listをベクトルからリストとして渡しますインデックスの。等しい長さのベクトルのリストを作る

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

はのがベスト(コード&または最速の最短量)何私はベクトルのリストにそれを破るしたいと各ベクトルの長さが3であるとしましょうへの道:私はこのベクトルを持っていると言うレだからこれを達成する?我々は10/3(length(n) - 10 %% 3)から1(10 %% 3)の残りがあるので、項目10を投げ捨てたい。

これは、これは私たちに3のグループを作ることができないものの指標を与える所望の成果

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

です:

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

EDIT

はここです興味深いアプローチは、Wojciech Sobalaによって投稿された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

すべての偉大な答えを、私はXを考えます彼は最短のコードワイズです。ありがとう、それは私を悩ましていた。私がやっていたことよりもはるかに良いアプローチ。 –

答えて

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

@ tyler-rinker速いのかどうかわかりません... – Alex

+0

リストではありませんので、ポスターの質問では動作しません。あなたが 'data.frame'で' output'をラップしない限り –

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

再帰関数を理解するには、関数呼び出しの連鎖に続いて、紙と鉛筆を使用すると助けになることがあります。あるいは、そこに2つのprintステートメントを入れて、リストが成長し、ベクトルが縮小するのを見ます。 –

関連する問題