lag base in R vettore / dataframe
-
01-10-2019 - |
Domanda
molto probabilmente esporre che io sono nuovo a R, ma in SPSS, in esecuzione GAL è molto facile. Ovviamente si tratta di un errore dell'utente, ma quello che mi manca?
x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds
Risultati in:
x y
[1,] 4 4
[2,] 6 6
[3,] 3 3
[4,] 4 4
[5,] 3 3
[6,] 5 5
[7,] 8 8
[8,] 9 9
[9,] 3 3
[10,] 7 7
Ho pensato che avrei visto:
x y
[1,] 4
[2,] 6 4
[3,] 3 6
[4,] 4 3
[5,] 3 4
[6,] 5 3
[7,] 8 5
[8,] 9 8
[9,] 3 9
[10,] 7 3
Qualsiasi orientamento sarà molto apprezzato.
Soluzione
Un altro modo per affrontare questo sta usando il pacchetto zoo, che ha un metodo ritardo che volontà pad il risultato con NA:
require(zoo)
> set.seed(123)
> x <- zoo(sample(c(1:9), 10, replace = T))
> y <- lag(x, -1, na.pad = TRUE)
> cbind(x, y)
x y
1 3 NA
2 8 3
3 4 8
4 8 4
5 9 8
6 1 9
7 5 1
8 9 5
9 5 9
10 5 5
Il risultato è un oggetto zoo multivariata (che è una matrice avanzata), ma facilmente convertito in un data.frame tramite
> data.frame(cbind(x, y))
Altri suggerimenti
Ho avuto lo stesso problema, ma io non voglio usare zoo o XTS, così ho scritto un semplice funzione per il frame di dati ritardo:
lagpad <- function(x, k) {
if (k>0) {
return (c(rep(NA, k), x)[1 : length(x)] );
}
else {
return (c(x[(-k+1) : length(x)], rep(NA, -k)));
}
}
Questo può essere in ritardo in avanti o indietro:
x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
x
[1,] 1 NA 2
[2,] 2 1 3
[3,] 3 2 NA
lag
non sposta i dati, si sposta solo la "base dei tempi". x
non ha "base dei tempi", in modo da cbind
non funziona come previsto. Prova cbind(as.ts(x),lag(x))
e notare che un "ritardo" di 1 turni periodi avanti .
Vorrei suggerire utilizzando zoo
/ xts
per le serie temporali. Le vignette zoo
sono particolarmente utili.
lag()
funziona con la serie di tempo, mentre si sta tentando di utilizzare matrici nude. Questa vecchia questione suggerisce di utilizzare embed
, invece, in questo modo:
lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)
per esempio
> x
[1] 8 2 3 9 8 5 6 8 5 8
> lagmatrix(x, 1)
[,1] [,2]
[1,] 8 NA
[2,] 2 8
[3,] 3 2
[4,] 9 3
[5,] 8 9
[6,] 5 8
[7,] 6 5
[8,] 8 6
[9,] 5 8
[10,] 8 5
Utilizzando le funzioni di ricerca proprio standard, questo può essere realizzato in un modo molto più semplice:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
Il modo più semplice per me ora sembra essere il seguente:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
Questo dovrebbe ospitare vettori o matrici nonché ritardi negativi:
lagpad <- function(x, k=1) {
i<-is.vector(x)
if(is.vector(x)) x<-matrix(x) else x<-matrix(x,nrow(x))
if(k>0) {
x <- rbind(matrix(rep(NA, k*ncol(x)),ncol=ncol(x)), matrix(x[1:(nrow(x)-k),], ncol=ncol(x)))
}
else {
x <- rbind(matrix(x[(-k+1):(nrow(x)),], ncol=ncol(x)),matrix(rep(NA, -k*ncol(x)),ncol=ncol(x)))
}
if(i) x[1:length(x)] else x
}
un modo semplice per fare la stessa cosa può essere la copia dei dati per un nuovo data inquadrare e cambiando il numero di indice. Assicurarsi che la tabella originale è indicizzato in sequenza senza spazi
per es.
tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)
se si vuole che nello stesso frame di dati come l'originale uso di una funzione cbind
opzioni Due, in base R
e con data.table
:
baseShiftBy1 <- function(x) c(NA, x[-length(x)])
baseShiftBy1(x)
[1] NA 3 8 4 8 9 1 5 9 5
data.table::shift(x)
[1] NA 3 8 4 8 9 1 5 9 5
Dati:
set.seed(123)
(x <- sample(c(1:9), 10, replace = T))
[1] 3 8 4 8 9 1 5 9 5 5
Proprio sbarazzarsi di lag. Cambia la tua linea per y a:
y <- c(NA, x[-1])