web-dev-qa-db-fra.com

Décalage de base dans le vecteur R/trame de données

Exposera probablement le fait que je suis un nouvel utilisateur de R, mais sous SPSS, les décalages sont très faciles. Évidemment c'est une erreur de l'utilisateur, mais qu'est-ce qui me manque?

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

Résulte en:

      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 verrais:

     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

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

31
Btibert3

Une autre façon de résoudre ce problème consiste à utiliser le paquet Zoo, qui a une méthode de décalage qui compense le résultat avec 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 Zoo multivarié (qui est une matrice améliorée), mais facilement converti en data.frame via

> data.frame(cbind(x, y))
26
Gavin Simpson

J'ai eu le même problème, mais je ne voulais pas utiliser Zoo ou xts, alors j'ai écrit une simple fonction lag pour les cadres de données :

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

Cela peut retarder ou reculer:

x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
     x      
[1,] 1 NA  2
[2,] 2  1  3
[3,] 3  2 NA
24
Andrew

lag ne décale pas les données, il décale seulement 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 remarquez qu'un "décalage" de 1 décale les périodes avant .

Je suggérerais d’utiliser Zoo/xts pour les séries chronologiques. Les vignettes Zoo sont particulièrement utiles.

14
Joshua Ulrich

lag() fonctionne avec des séries chronologiques, alors que vous essayez d'utiliser des matrices nues. Cette vieille question suggère d'utiliser plutôt embed, 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
6
zwol

En utilisant simplement les fonctions R standard, ceci peut être réalisé de manière beaucoup plus simple:

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

Le moyen le plus simple pour moi semble être le suivant:

require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
2
matt_jay

Cela devrait s’adapter aux vecteurs ou matrices ainsi qu’aux retards négatifs:

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
}
2
Jeff Cole
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
2
Paweł Sakowski

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

Les données:

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

un moyen simple de faire la même chose peut être de copier les données dans une nouvelle image frame et de changer le numéro d'index. Assurez-vous que la table d'origine est indexée séquentiellement, sans espace

par exemple.

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

si vous le souhaitez dans le même cadre de données que l'original, utilisez une fonction cbind 

0
Abhishek Lahiri