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.

È stato utile?

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])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top