首页 文章

dplyr自定义滞后函数用于不规则时间序列

提问于
浏览
3

我有一个不规则的时间序列,数据集中存在间隙 . 此外,数据被分组 . 滞后函数我已经能够通过观察找到滞后(因此他们找到数据集中的先前记录),但我想指定一个时间变量并通过匹配滞后时间计算滞后 . 这个问题:R lag/lead irregular time series data正在做类似的事情 . 但是,我不能使用 zoo 解决方案(我有某种程序包不兼容,根本不能使用 zoo )并且未能成功地使 data.table 解决方案变得足够灵活,可以用作滞后量作为输入的函数和分组数据的能力 .

测试数据:

testdf <- data.frame(group = c(1,1,1,1,1,2,2,2,2,2),
                 counter = c(1,2,3,5,6,7,8,9,11,12),
                 xval = seq(100, 1000, 100))
lagamount <- 1

输出应为矢量:NA 100 200 NA 400 NA 600 700 NA 900

这就是我目前使用的内容:

library(dplyr)
testout <- group_by(testdf, group) %>%
  mutate(testout = function(x) which((testdf$counter - x) == lagamount))

这给了我一个数据类型错误,某些东西(未指定)不是一个向量 .

有没有办法让这个建筑工作?或者,如何使用分组变量来处理不规则的时间序列?

2 回答

  • 4

    dplyr 中执行此操作的唯一方法是,在不使用 do 的情况下,首先将隐式缺失值显式化,然后将其过滤掉 .

    提供一个变异的向量,并使用 ifelse (或者可能是新的 dplyr::if_else )来检查滞后是否是你想要的 . 例:

    library(tidyr)
    lagamount <- 2
    
    testout <- group_by(testdf, group) %>%
      complete(group, counter = min(counter):max(counter)) %>% 
      mutate(testout = if_else(counter - lag(counter, lagamount) == lagamount, 
                               lag(xval, lagamount), 
                               NA_real_)) %>% 
      filter(!is.na(xval))
    

    生产环境 :

    Source: local data frame [10 x 4]
    Groups: group [2]
    
       group counter  xval testout
       <dbl>   <dbl> <dbl>   <dbl>
    1      1       1   100      NA
    2      1       2   200      NA
    3      1       3   300     100
    4      1       5   400     300
    5      1       6   500      NA
    6      2       7   600      NA
    7      2       8   700      NA
    8      2       9   800     600
    9      2      11   900     800
    10     2      12  1000      NA
    
  • 0

    当我将上述答案转换为函数时,我最终必须明确地展开扩展并删除if_else中的严格数据类型 . 这是最终形式 .

    getlag <- function(timevar, valuevar, laglength){
      df1 <- data.frame(counter = timevar, value = valuevar, indf = 1)
      alltimes <- data.frame(counter = seq(min(timevar), max(timevar)))
      df2 <- merge(alltimes, df1, all.x = TRUE)
      df2 <- df2 %>%
        mutate(lagvals = ifelse(counter - lag(counter, laglength) == laglength,
                                lag(value, laglength),
                                NA_real_)) %>%
        filter(!is.na(indf))
      return(df2$lagvals)
      }
    

    测试用例是:

    testout <- group_by(testdf, group) %>%
      mutate(testout = getlag(counter, xval, 1))
    

相关问题