很可能会暴露我是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
非常感谢任何指导。
答案 0 :(得分:27)
另一种解决方法是使用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
结果是一个多变量动物园对象(它是一个增强矩阵),但很容易通过
转换为data.frame> data.frame(cbind(x, y))
答案 1 :(得分:26)
我有同样的问题,但我不想使用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
答案 2 :(得分:15)
lag
不会移动数据,它只会改变“时基”。 x
没有“时基”,因此cbind
无法按预期工作。试试cbind(as.ts(x),lag(x))
并注意“滞后”为1会将期间向前移动。
我建议使用zoo
/ xts
作为时间序列。 zoo
小插曲特别有用。
答案 3 :(得分:7)
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
答案 4 :(得分:5)
仅使用标准R函数,可以通过更简单的方式实现:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
答案 5 :(得分:3)
现在对我来说最简单的方法如下:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
答案 6 :(得分:2)
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
答案 7 :(得分:2)
这应该适应向量或矩阵以及负滞后:
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 :(得分:2)
使用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
答案 9 :(得分:0)
执行相同操作的简单方法可能是将数据复制到新数据 框架和更改索引号。确保原始表按顺序索引,没有间隙
e.g。
tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)
如果你想在与原版相同的数据框中使用cbind函数
答案 10 :(得分:0)
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 :(得分:0)
我采用了类似于Andrew's的解决方案(专用功能而不是Input - Output
1L - 002L
03R - 004L
483L - 484L
232R 233L 234L - 235L
08L 009L - 010L
4L 005R 6R - 007L
89L 90R 91L - 092L
或xts
),但是我采用了更简洁的表达方式:
zoo
答案 12 :(得分:-1)
摆脱滞后。将y的行更改为:
y <- c(NA, x[-1])