Я пытался использовать flodel's answer, но это было слишком медленно в моем случае с очень большим x
(и функция должна вызываться повторно). Поэтому я создал следующую функцию, которая намного быстрее, но также очень уродлива и не ведет себя правильно. В частности, он ничего не проверяет и вернет багги результаты, по крайней мере, для pos >= length(x)
или pos <= 0
(вы можете добавить эти проверки самостоятельно, если вы не уверены в своих источниках и не слишком обеспокоены скоростью), и, возможно, и в некоторых других случаях , так что будь осторожен.
splitAt2 <- function(x, pos) {
out <- list()
pos2 <- c(1, pos, length(x)+1)
for (i in seq_along(pos2[-1])) {
out[[i]] <- x[pos2[i]:(pos2[i+1]-1)]
}
return(out)
}
Однако splitAt2
работает примерно в 20 раз быстрее, с й длиной 10 :
library(microbenchmark)
W <- rnorm(1e6)
splits <- cumsum(rep(1e5, 9))
tm <- microbenchmark(
splitAt(W, splits),
splitAt2(W, splits),
times=10)
tm
Спасибо, это отлично работает для меня! Я по-прежнему удивлен, что функция «splitAt» реализована в базе R ... – user1981275
Эта функция очень медленная с очень большим 'x', возможно, из-за' seq_along (x) ', который создает очень длинный вектор, а затем '% in%', который должен соответствовать этому очень длинному вектору. – Calimo
@Calimo: нет, если вы просматриваете его, вы увидите, что большую часть времени тратится на медленный 'split'. Вы можете избежать этого, но вы потеряете много с точки зрения удобочитаемости и компактности кода. – flodel