Основная отставание в R вектор / dataframe
-
01-10-2019 - |
Вопрос
Скорее всего, вызовут, что я новичок в 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])