我正在尝试将数据框中的特定列滞后 2。我只找到关于滞后特定列 1 的帖子,因此我不确定如何使特定列滞后超过单个值滞后。这是一些模拟数据。
df <- data.frame(
A = seq(1,7),
B = seq(8,14),
C = seq(15,21),
D = seq(22,28)
)
df
> df
A B C D
1 8 15 22
2 9 16 23
3 10 17 24
4 11 18 25
5 12 19 26
6 13 20 27
7 14 21 28
我在这里想做的是滞后 A、C 和 D 中的值以创建不同的 df。最终,我想为这些列中的每一列滞后 1、2 和 3 个值,以生成 3 个不同的数据集。我不一定需要滞后 1、2 和 3 个值的示例,只需一个可以指定滞后值的示例就足够了。
具有 2 值滞后的最终数据帧的示例如下所示。
> df
A B C D
NA 8 NA NA
NA 9 NA NA
1 10 15 22
2 11 16 23
3 12 17 24
4 13 18 25
5 14 19 26
6 NA 20 27
7 NA 21 28
这是一些快速而肮脏的东西:
foo <- function(df, n, lag_cols) {
result <- df[c(rep(NA, n), 1L:(nrow(df))), ]
non_lag_cols <- setdiff(names(df), lag_cols)
result[non_lag_cols] <- lapply(
result[(n+1):(nrow(result)), non_lag_cols, drop=FALSE],
\(x) c(x, rep(NA, n))
)
return(result)
}
foo(df, 2, c("A", "C", "D"))
# A B C D
# NA NA 8 NA NA
# NA.1 NA 9 NA NA
# 1 1 10 15 22
# 2 2 11 16 23
# 3 3 12 17 24
# 4 4 13 18 25
# 5 5 14 19 26
# 6 6 NA 20 27
# 7 7 NA 21 28
library(dplyr)
rbind(df, df[0,][rep(NA, 2),]) %>%
mutate(across(-2, ~lag(., 2))) %>%
`rownames<-`(NULL)
#> A B C D
#> 1 NA 8 NA NA
#> 2 NA 9 NA NA
#> 3 1 10 15 22
#> 4 2 11 16 23
#> 5 3 12 17 24
#> 6 4 13 18 25
#> 7 5 14 19 26
#> 8 6 NA 20 27
#> 9 7 NA 21 28
创建于 2024-04-18,使用 reprex v2.0.2