r - 不规则时间序列的 dplyr 自定义滞后函数

我有一个不规则的时间序列,数据集中存在间隙。此外,数据被分组。滞后函数我已经能够通过观察找到滞后(因此它们在数据集中找到了先前的记录),但我想指定一个时间变量并通过匹配滞后时间来计算滞后。本题: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))

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

有没有办法让这个建筑工作?或者,我怎么会滞后于带有分组变量的不规则时间序列?

最佳答案

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

https://stackoverflow.com/questions/38245975/

相关文章:

django - 模型中的用户 OneToOneField

java - 为什么 Double::compareTo 可以作为 Stream.max(Compa

java - 如何根据对象的属性在 Java 8 中找到总和

coq - Coq 分支和回溯的多次成功?

firebase - iOS 离线时的 FCM 行为

assembly - 为什么这段代码在调用函数后两次弹出到同一个寄存器?

angularjs - 为什么模块 'ui.bootstrap' 不可用?

java - 检查字符串中是否存在模式

r - 从列值比较中确定 R 数据框行值

r - 如何原型(prototype)(启动)从其他插槽派生的 S4 插槽?