R向量/数据帧中的基本滞后
Posted
技术标签:
【中文标题】R向量/数据帧中的基本滞后【英文标题】:Basic lag in R vector/dataframe 【发布时间】:2011-04-03 07:20:47 【问题描述】:很可能会暴露我是 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或者xts,所以写了一个简单的lag function for data frames:
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
【讨论】:
假设我想在一个向量上执行此功能,但对多个滞后执行递归lagpad(x,-1:-216)
并将该信息输出到一个数据帧中(例如 lagpad(x,-1) 变为变量 #1 of df, lagpad(x,-2) 成为 df 的变量 #2,lagpad(x,-3) 成为 df 的变量 #3 ...等等。我是否必须 cbind 216 列或者是否有一个让您的代码适应这种情况的更短的方法?【参考方案2】:
解决这个问题的另一种方法是使用 zoo 包,它有一个 lag 方法,可以用 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> data.frame(cbind(x, y))
【讨论】:
另请注意,如果 z 是动物园系列,则 lag(z, 0:-1) 是一个两列动物园系列,其中包含原始系列和滞后系列。此外,coredata(z) 将只返回动物园系列的数据部分,而 as.data.frame(z) 将返回一个数据帧,其中 z 的数据部分作为列内容。 我是唯一一个发现 zoo 正在倒退的人吗?在这个例子中,k=-1 是负数,所以我希望 y 领先,但实际上它落后于 x。默认值为 k=1,所以如果我写“y = lag(x)”,我最终会得到 y 前导 x。这是……误导。 zoo 的设计原则包括与基本 R 的一致性,并且在基本 R 中,正滞后会导致系列更早开始。见 ?lag【参考方案3】:lag
不会移动数据,它只会移动“时基”。 x
没有“时基”,因此 cbind
无法按您的预期工作。尝试cbind(as.ts(x),lag(x))
并注意“滞后”为 1 会使周期向前移动。
我建议将zoo
/ xts
用于时间序列。 zoo
小插曲特别有用。
【讨论】:
zoo
和 xts
似乎都没有库存,我在哪里可以买到?
install.packages("xts") # this will install zoo as well
【参考方案4】:
仅使用标准的 R 函数,这可以通过更简单的方式实现:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
【讨论】:
【参考方案5】:lag()
适用于时间序列,而您正在尝试使用裸矩阵。 This old question 建议改用 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
【讨论】:
【参考方案6】:现在对我来说最简单的方法如下:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
【讨论】:
是的!在任何情况下,只需将 dplyr::lag 换成标准滞后,然后在非时间序列上工作正常......工作完成!【参考方案7】:tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
【讨论】:
【参考方案8】:这应该适应向量或矩阵以及负滞后:
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
【讨论】:
【参考方案9】:使用data.table
:
> x <- sample(c(1:9), 10, replace = T)
> y <- data.table::shift(x)
> ds <- cbind(x, y)
> ds
x y
[1,] 5 NA
[2,] 4 5
[3,] 3 4
[4,] 3 3
[5,] 4 3
[6,] 8 4
[7,] 1 8
[8,] 7 1
[9,] 9 7
[10,] 7 9
【讨论】:
【参考方案10】:一种简单的方法可能是将数据复制到新数据 框架和更改索引号。确保原始表按顺序索引,没有间隙
例如
tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)
如果您希望它与原始数据框位于相同的数据框中,请使用 cbind 函数
【讨论】:
【参考方案11】:两个选项,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
【讨论】:
【参考方案12】:我采用了与Andrew's 类似的解决方案(专用函数而不是xts
或zoo
),但我发现更容易推理的更简洁的公式:
lagpad <- function(x, k)
if (k == 0) return(x)
k.pos <- max(0, k)
k.neg <- max(0, -k)
c(rep(NA, k.pos), head(x, -k.pos), # empty if k<0, else lagging x
tail(x, -k.neg), rep(NA, k.neg)) # empty if k>0, else leading x
【讨论】:
【参考方案13】:摆脱滞后。将 y 行更改为:
y <- c(NA, x[-1])
【讨论】:
这是不正确的!可能你想说y <- c(NA, head(x, -1))
以上是关于R向量/数据帧中的基本滞后的主要内容,如果未能解决你的问题,请参考以下文章