В вопросе здесь, на 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))
}