代码之家  ›  专栏  ›  技术社区  ›  spore234

向tbl添加x滞后值[复制]

  •  0
  • spore234  · 技术社区  · 6 年前

    我有这样的藏品:

    df <- tibble(value = rnorm(500))
    

    我可以做一次延迟:

    lag_df <- df %>%
      mutate(value_lag = lag(value, n = 1)) %>%   # first lag
      filter(!is.na(value_lag))    # remove NA
    

    lag_df <- df %>%
      mutate(value_lag1 = lag(value, n = 1)) %>%   # first lag
      mutate(value_lag2 = lag(value, n = 2)) %>%   # second lag
      mutate(value_lag3 = lag(value, n = 3)) %>%   # third lag
      filter(!is.na(value_lag1))    # remove NA
      filter(!is.na(value_lag2))    # remove NA
      filter(!is.na(value_lag3))    # remove NA
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ronak Shah    6 年前

    dplyr 解决方案之一是为每个滞后值创建一个列 cbind NA 值与 na.omit()

    library(dplyr)
    cbind(df, sapply(1:10, function(x) lag(df$value, n = x))) %>%
       na.omit()
    

    tidyverse 以我的残缺技能

    library(tidyverse)
    tibble(n=1:10)  %>% mutate(output = map2(list(df),n ,function(x,y){
        x %>% mutate(value = lag(value,y))
    })) %>% spread(n,output) %>% unnest() %>% na.omit()
    


    还有一个简短的版本

    map2(list(df), 1:10, function(x, y) {
      x %>% mutate(value = lag(value,y))
        }) %>%
    bind_cols() %>% na.omit()