簡體   English   中英

自動為數據框列表創建新列 - R

[英]Automating the creation of new columns for a list of dataframes - R

我的任務是為一系列數據框創建滯后指標。 每個 dataframe 都有兩列:日期和值。 對於每個“值”列,我需要創建 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

所示值僅用於說明目的,實際數據具有經濟性質,因此不遵循特定模式。

到目前為止,我只設法弄清楚如何為單個數據框一次創建一列,但這不是很有效。 我需要一種方法來遍歷所有數據框並創建其他列。

提前感謝您的幫助!

循環遍歷您需要的許多滯后,創建新列值的列表,然后一次將它們全部添加回來。

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

您當然可以使用 dplyr 中的lag dplyr或類似的 function 代替我的lagfun ,但這將是獨立的。

另一種解決方案,基於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM