Question

sera très probablement exposer que je suis nouveau à R, mais dans SPSS, en cours d'exécution est très facile retards. Il est évident que cela est une erreur d'utilisateur, mais ce que je suis absent?

x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds

Résultats dans:

      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

Je pensais que je voyais:

     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

sera très appréciée Toute orientation.

Était-ce utile?

La solution

Une autre façon de traiter est d'utiliser le package zoo, qui a une méthode de décalage qui volonté le résultat est complété 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

Le résultat est un objet à plusieurs variables de zoo (qui est une matrice renforcée), mais facilement converti en un data.frame via

> data.frame(cbind(x, y))

Autres conseils

lag ne se déplace pas les données, il ne fait que déplacer la « base de temps ». x n'a pas de « base de temps », donc cbind ne fonctionne pas comme prévu. Essayez cbind(as.ts(x),lag(x)) et avis qu'un "retard" de 1 décale les périodes avant .

Je suggère à l'aide zoo / xts pour les séries chronologiques. Les vignettes de zoo sont particulièrement utiles.

lag() travaille avec des séries de temps, alors que vous essayez d'utiliser des matrices nues. Cette vieille question suggère d'utiliser embed à la place, comme suit:

lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)

par exemple

> 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

En utilisant uniquement les fonctions standard de R ceci peut être réalisé d'une manière beaucoup plus simple:

x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds

La façon la plus simple me semble maintenant être le suivant:

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

Cela devrait accueillir des vecteurs ou des matrices, ainsi que les LAG négatives:

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
}

une façon simple de faire la même chose peut être copier les données vers une nouvelle données cadre et en changeant le numéro d'index. Assurez-vous que la table d'origine est indexé de manière séquentielle, sans espace

par exemple.

tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)

si vous le voulez dans le même cadre de données que l'utilisation d'une fonction originale de cbind

Deux options, base R et 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   

Données:

set.seed(123)
(x <- sample(c(1:9), 10, replace = T))
[1] 3 8 4 8 9 1 5 9 5 5

Il suffit de se débarrasser de lag. Changez votre ligne pour y à:

y <- c(NA, x[-1])
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top