【问题标题】:Automating the creation of new columns for a list of dataframes - R自动为数据框列表创建新列 - R
【发布时间】:2022-01-03 06:53:39
【问题描述】:

我的任务是为一系列数据框创建滞后指标。每个数据框都有两列:日期和值。对于每个“值”列,我需要创建 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

显示的值仅用于说明目的,实际数据具有经济性质,因此不遵循特定模式。

到目前为止,我只设法弄清楚如何为单个数据框一次创建一列,但这不是很有效。我需要一种方法来遍历所有数据框并创建其他列。

提前感谢您的帮助!

【问题讨论】:

    标签: r dataframe for-loop


    【解决方案1】:

    循环遍历您需要多少滞后,创建新列值的列表,然后一次将它们全部添加回来。

    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 函数或类似函数来代替我的lagfun,但这将是独立的。

    【讨论】:

    • 谢谢你,它工作得很好!如果需要领先指标,你会怎么做?
    • leadfun &lt;- function(x,n) c(rep(NA,n), head(x,-n)) 或使用 dplyr 的 lead 函数。
    【解决方案2】:

    另一种解决方案,基于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
    

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多