5

ここSO(LINK)の質問で、ポスターが質問をし、私はうまくいく答えを出しましたがlist、インデックスのリストとして渡すためにベクトルからを作成して、私を悩ませている部分があります。だから、私はこのベクトルを持っていると言います:

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

それをベクトルのリストに分割したいとしましょう。各ベクトルの長さは3です。これを実現するための最良の(コードの量が最も少ない、または最も速い)方法は何ですか?10 %% 310/3()から1()の余りがあるので、アイテム10を捨てたいと思いlength(n) - 10 %% 3ます。

これは望ましい結果です

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

これにより、3つのグループを作成できないもののインデックスが得られます。

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

編集

これは、これがリンクされている他のスレッドにWojciech Sobalaによって投稿された興味深いアプローチです(私は彼らにここで答えるように頼みました、そして彼らがそうするなら私はこの編集を削除します)

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))
}
4

3 に答える 3

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
于 2012-05-19T03:02:55.743 に答える
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
于 2012-05-19T03:12:59.823 に答える
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
于 2012-05-19T03:46:57.697 に答える