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