Составьте список векторов одинаковой длины

В вопросе здесь, на SO ( ССЫЛКА ), автор задал вопрос, и я дал ответ, который работает, но есть часть, которая меня раздражает, создавая listиз вектора для передачи в виде списка индексов. Итак, скажем, у меня есть этот вектор:

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

Допустим, я хочу разбить его на список векторов, и каждый вектор имеет длину 3. Каков наилучший (кратчайший объем кода или самый быстрый) способ выполнить это? Мы хотим выбросить элемент 10, так как в нем есть остаток 1 ( 10 %% 3) от 10/3 ( length(n) - 10 %% 3).

Это желаемый результат

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

Это даст нам индексы тех, кто не может составить группу из трех:

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

РЕДАКТИРОВАТЬ

Вот интересный подход, опубликованный Войцехом Собалой на другом 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))
}

5
задан Community 23 May 2017 в 11:49
поделиться