Вопрос

Скорее всего, вызовут, что я новичок в R, но в СПСС, бегающие лаги очень легко. Очевидно, что это ошибка пользователя, но что мне не хватает?

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

Результаты в:

      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

Я подумал, что увижу:

     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

Любое руководство будет высоко оценено.

Это было полезно?

Решение

Другой способ справиться с этим, используют пакет зоопарка, который имеет метод отставания, который будет прокладывать результат с 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

Результатом является многомерный объект зоопарка (который является расширенной матрицей), но легко преобразуется в данные. Справка через

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

Другие советы

У меня была та же проблема, но я не хотел использовать зоопарк или XTS, поэтому я написал простой Функция LAG для кадров данных:

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

Это может отставать вперед или назад:

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 Не смещает данные, он только сдвигает «временной базу». x не имеет «базы времени», так cbind не работает, как вы ожидали. Пытаться cbind(as.ts(x),lag(x)) и обратите внимание, что «отставание» из 1 сдвигается периоды вперед.

Я бы предложил использовать zoo / xts Для временных рядов. То zoo Виньетки особенно полезны.

lag() Работает со временными рядами, тогда как вы пытаетесь использовать голые матрицы. Этот старый вопрос предлагает использовать embed Вместо этого, как так:

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

например

> 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

Использование только стандартных функций R Это может быть достигнуто в гораздо более простом способом:

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

Самый простой способ для меня сейчас, кажется, следующий:

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

Это должно приспособить векторы или матрицы, а также отрицательные отгибы:

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
}

Простой способ сделать то же самое, может копировать данные в новый кадр данных и изменение номера индекса. Убедитесь, что оригинальная таблица индексируется последовательно без пробелов

например

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

Если вы хотите это в одном кадре данных, что и оригинал, используйте функцию CBIND

Два варианта, в base R и с 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   

Данные:

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

Просто избавьтесь от отставания. Измените свою линию на Y:

y <- c(NA, x[-1])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top