décalage de base en R vecteur / trame de données
-
01-10-2019 - |
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.
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
J'ai eu le même problème, mais je ne voulais pas utiliser zoo ou XTS, donc je l'ai écrit simple fonction lag pour les trames de données de:
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 lag avant ou en arrière:
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
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])