Базовый лаг в векторе/фрейме R
Скорее всего, я покажу, что я новичок в R, но в SPSS работать с задержками очень легко. Очевидно, что это ошибка пользователя, но что мне не хватает?
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
Любые рекомендации будут высоко оценены.
Ответы
Ответ 1
Другой способ справиться с этим - использовать пакет zoo, который имеет метод задержки, который будет обрабатывать результат с помощью 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
Результатом является многомерный объект zoo (который является расширенной матрицей), но легко преобразуется в data.frame через
> data.frame(cbind(x, y))
Ответ 2
У меня была такая же проблема, но я не хотел использовать zoo или xts, поэтому я написал простую функцию задержки для фреймов данных
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
Ответ 3
lag
не сдвигает данные, а только сдвигает "временную основу". x
не имеет "временной базы", поэтому cbind
работает не так, как вы ожидали. Попробуйте cbind(as.ts(x),lag(x))
и обратите внимание, что "отставание" от 1 сдвигает периоды вперед.
Я предлагаю использовать zoo
/xts
для временных рядов. Особенно полезны виньетки zoo
.
Ответ 4
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
Ответ 5
Используя только стандартные функции R, это может быть достигнуто гораздо проще:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
Ответ 6
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
Ответ 7
Это должно вместить векторы или матрицы, а также отрицательные задержки:
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
}
Ответ 8
Самый простой способ для меня теперь выглядит следующим образом:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
Ответ 9
простой способ сделать то же самое может быть копирование данных в новые данные
кадр и изменение номера индекса. Убедитесь, что исходная таблица индексируется последовательно без пробелов
например.
tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)
если вы хотите, чтобы он находился в том же фрейме данных, что и оригинал, используйте функцию cbind
Ответ 10
Два варианта, в 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
Ответ 11
Просто избавься от лаг. Измените свою линию на y, чтобы:
y <- c(NA, x[-1])