我的任務是為一系列資料框創建滯后指標。每個資料框有兩列:日期和值。對于每個“值”列,我需要創建 12 個新列,其中滯后增加一個單位。
給定的資料框如下所示:
date | value |
01-01-2021 1
02-01-2021 2
03-01-2021 3
04-01-2021 4
05-01-2021 5
06-01-2021 6
07-01-2021 7
08-01-2021 8
我需要添加新列,使它們最終看起來像這樣:
date | value | lag1 | ... | lag12
01-01-2021 1 2 13
02-01-2021 2 3 14
03-01-2021 3 4 15
04-01-2021 4 5 16
05-01-2021 5 6 17
06-01-2021 6 7 18
07-01-2021 7 8 19
08-01-2021 8 9 20
顯示的值僅用于說明目的,真實資料具有經濟性質,因此沒有遵循特定模式。
到目前為止,我只設法弄清楚如何為單個資料框一次創建一列,但這不是很有效。我需要一種方法來遍歷所有資料框并創建附加列。
在此先感謝您的幫助!
uj5u.com熱心網友回復:
回圈你需要的多少延遲,創建一個新列值的串列,然后一次將它們添加回來。
lagfun <- function(x,n) c(tail(x,-n), rep(NA,n))
dat[paste0("lag", 1:7)] <- lapply(1:7, lagfun, x=dat$value)
dat
# date value lag1 lag2 lag3 lag4 lag5 lag6 lag7
#1 01-01-2021 1 2 3 4 5 6 7 8
#2 02-01-2021 2 3 4 5 6 7 8 NA
#3 03-01-2021 3 4 5 6 7 8 NA NA
#4 04-01-2021 4 5 6 7 8 NA NA NA
#5 05-01-2021 5 6 7 8 NA NA NA NA
#6 06-01-2021 6 7 8 NA NA NA NA NA
#7 07-01-2021 7 8 NA NA NA NA NA NA
#8 08-01-2021 8 NA NA NA NA NA NA NA
您當然可以使用lagfromdplyr或類似的函式來代替 my lagfun,但這將是獨立的。
uj5u.com熱心網友回復:
另一種解決方案,基于purrr::map_dfc:
library(tidyverse)
df <- data.frame(
stringsAsFactors = FALSE,
date = c("01-01-2021",
"02-01-2021","03-01-2021","04-01-2021","05-01-2021",
"06-01-2021","07-01-2021","08-01-2021"),
value = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L)
)
n <- 7
df %>%
bind_cols(map_dfc(1:n,
~ lead(select(df,2), .x) %>%
setNames(str_c("lag", .x))))
#> date value lag1 lag2 lag3 lag4 lag5 lag6 lag7
#> 1 01-01-2021 1 2 3 4 5 6 7 8
#> 2 02-01-2021 2 3 4 5 6 7 8 NA
#> 3 03-01-2021 3 4 5 6 7 8 NA NA
#> 4 04-01-2021 4 5 6 7 8 NA NA NA
#> 5 05-01-2021 5 6 7 8 NA NA NA NA
#> 6 06-01-2021 6 7 8 NA NA NA NA NA
#> 7 07-01-2021 7 8 NA NA NA NA NA NA
#> 8 08-01-2021 8 NA NA NA NA NA NA NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367552.html
