如何使用数据创建滞后数据(所有向前组合).在R的桌子?



我需要用一个变量的所有可能组合创建一个数据框架。我找到了一个使用数据的例子。表:

df <- data.frame("Age"=1:10)
df <- setDT(df)
df[,lag.Age1 := c(NA,Age[-.N])]

创建如下:

Age lag.Age1
1:   1       NA
2:   2        1
3:   3        2
..   ..       ..
10: 10        9

现在,我想继续添加滞后向量,产生这样的结果:

Age lag.Age1  lag.Age2  lag.Age3
1:   1       NA     NA       NA
2:   2        1     NA       NA
3:   3        2     1        NA
..   ..       ..    ..       ..
10: 10        9     8         7

我尝试了第三列:

df[,lag.Age2 := c(NA,NA,Age[1:8])]

但是我真的不明白数据是怎么回事。桌子在这里工作。那行运行了,但没有做任何事情。

编辑:如果数据框架有一个组变量,我想要延迟按组完成吗?对于第一个延迟,它只是:

df <- data.frame("Age"=1:10, "Group"=c(rep("A",4),rep("B",6)))
df[,lag.Age1 := c(NA,Age[-.N]), by="Group"]

现在是什么情况?请注意,组的长度不同。

data.table::shift()非常强大,因为您可以提供偏移量矢量;例如,如果您想要n滞后列(从1到n),您可以这样做:

n=3            
cols = paste0("lag.Age",1:n)
df[, c(cols):=shift(Age,1:n), Group]

输出:

Age  Group lag.Age1 lag.Age2 lag.Age3
<int> <char>    <int>    <int>    <int>
1:     1      A       NA       NA       NA
2:     2      A        1       NA       NA
3:     3      A        2        1       NA
4:     4      A        3        2        1
5:     5      B       NA       NA       NA
6:     6      B        5       NA       NA
7:     7      B        6        5       NA
8:     8      B        7        6        5
9:     9      B        8        7        6
10:    10      B        9        8        7

另外:

df[, c(paste0("lag.Age",1:3)):=shift(Age,1:3), Group]

如果你想让滞后的数量随组而变化,这个数字等于该组中的观察数1,那么一种方法是这样做:

# make function to return lags based on length of x
f <- function(x) shift(x,1:(length(x)-1))
# get unique groups
grps= unique(df$Group)
# set as DT, and use lapply()
setDT(df)
grp_lags = lapply(grps, (g) f(df[Group==g, Age]))
names(grp_lags)<-grps

输出:

$A
$A[[1]]
[1] NA  1  2  3
$A[[2]]
[1] NA NA  1  2
$A[[3]]
[1] NA NA NA  1

$B
$B[[1]]
[1] NA  5  6  7  8  9
$B[[2]]
[1] NA NA  5  6  7  8
$B[[3]]
[1] NA NA NA  5  6  7
$B[[4]]
[1] NA NA NA NA  5  6
$B[[5]]
[1] NA NA NA NA NA  5

或者,如果您有很多额外的列(即对于具有较少观察值的组),您可以这样做:

n = df[, .N, Group][,max(N)]
cols = paste0("lag.Age",1:n)
df[, c(cols):=shift(Age,1:n), Group]

输出:

Age Group lag.Age1 lag.Age2 lag.Age3 lag.Age4 lag.Age5 lag.Age6
1:   1     A       NA       NA       NA       NA       NA       NA
2:   2     A        1       NA       NA       NA       NA       NA
3:   3     A        2        1       NA       NA       NA       NA
4:   4     A        3        2        1       NA       NA       NA
5:   5     B       NA       NA       NA       NA       NA       NA
6:   6     B        5       NA       NA       NA       NA       NA
7:   7     B        6        5       NA       NA       NA       NA
8:   8     B        7        6        5       NA       NA       NA
9:   9     B        8        7        6        5       NA       NA
10:  10     B        9        8        7        6        5       NA

最新更新