R dividere il vettore numerico in posizione

Mi sto interrogando sul semplice compito di dividere un vettore in due in un determinato indice:

splitAt <- function(x, pos){ list(x[1:pos-1], x[pos:length(x)]) } a  splitAt(a, 4) [[1]] [1] 1 2 2 [[2]] [1] 3 

La mia domanda: ci deve essere qualche funzione esistente per questo, ma non riesco a trovarlo? È forse split una possibilità? Anche la mia implementazione ingenua non funziona se pos=0 o pos>length(a) .

Un miglioramento sarebbe:

 splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% pos))) 

che ora può assumere un vettore di posizioni:

 splitAt(a, c(2, 4)) # [[1]] # [1] 1 # # [[2]] # [1] 2 2 # # [[3]] # [1] 3 

E si comporta in modo appropriato (soggettivo) se pos <= 0 o pos >= length(x) nel senso che restituisce l'intero vettore originale in una singola voce di elenco. Se preferisci eseguire l'errore, usa stopifnot nella parte superiore della funzione.

Ho provato ad usare la risposta di flodel , ma nel mio caso era troppo lento con una x molto grande (e la funzione deve essere chiamata più volte). Così ho creato la seguente funzione che è molto più veloce, ma anche molto brutta e non si comporta correttamente. In particolare, non controlla nulla e restituisce risultati buggy almeno per pos >= length(x) o pos <= 0 (puoi aggiungerli tu stesso se non sei sicuro dei tuoi input e non sei troppo preoccupato per la velocità ), e forse anche in altri casi, quindi fai attenzione.

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

Tuttavia, splitAt2 viene eseguito circa 20 volte più velocemente con una x di lunghezza 10 6 :

 library(microbenchmark) W <- rnorm(1e6) splits <- cumsum(rep(1e5, 9)) tm <- microbenchmark( splitAt(W, splits), splitAt2(W, splits), times=10) tm 

Un’altra alternativa che potrebbe essere più veloce e / o più leggibile / elegante della soluzione di flodel :

 splitAt <- function(x, pos) { unname(split(x, findInterval(x, pos))) }