r语言 - 是否已经有一个函数可以在后面的季度中减去不同的变量



我有一个不平衡的季度面板数据集,缺少值。我想在接下来的季度中从A1中减去变量A2。请注意,我不想得到A2的差值,而是相互减去不同的变量。应该为每个uid单独计算差异。此外,像1999年第四季度和2000年第一季度这样的变化年份意味着是后续的。

我真的不确定我是否应该在这里连接我的时间索引,因为像动物园这样的包只需要一个索引。但这不是问题所在。下面是一些示例数据:

structure(list(uid = c(1, 1, 1, 2, 2, 3, 3, 3), tndx = c(1999.4, 
2000.1, 2000.2, 1999.4, 2000.1, 2000.1, 2000.2, 2000.3), A1 = c(2, 
2, 2, 10, 11, 1, 1, 1), A2 = c(3, 3, 3, 14, 14, 2, 100, 2)), .Names = c("uid", 
"tndx", "A1", "A2"), row.names = c(NA, -8L), class = "data.frame")
# which results in
  uid   tndx A1  A2
1   1 1999.4  2   3
2   1 2000.1  2   3
3   1 2000.2  2   3
4   2 1999.4 10  14
5   2 2000.1 11  14
6   3 2000.1  1   2
7   3 2000.2  1 100
8   3 2000.3  1   2  

如果您希望使用分隔索引,请使用以下示例:

# Thx Andrie!
x2 <- data.frame(x, colsplit(x$tndx, "\.", names=c("year", "qtr")))

是否有一个很好的方法来解决这个问题与reshape2, plyr或甚至基础或你宁愿写一个自定义函数?

注意,也有可能某些uid只发生一次。显然你不能计算滞后差。我还需要检查一下,然后创建一个NA

我们使用byuid上分割它,在对单个uid的每组行进行操作的函数中,我们使用yearqtr类创建一个动物园对象z作为索引。然后,我们将时间序列与一个空序列合并,该序列具有所有所需的四分之一,包括任何缺失的中间四分之一,给出zm,并执行计算,给出zz。最后,我们在输出时转换为data.frame格式:

library(zoo)
to.yearqtr <- function(x) as.yearqtr(trunc(x) + (10*(x-trunc(x))-1)/4)
DF <- do.call("rbind", by(x, x$uid, function(x) {
    # columns of x are: uid tndx A1 A2
    z <- zoo(x[c("A1", "A2")], to.yearqtr(x$tndx))
    zm <- merge(z, zoo(, seq(start(z), end(z), 1/4)))
    zz <- with(zm, cbind(zm, `A1 - A2 lag` = A1 - lag(A2, -1)))
    if (ncol(zz) <= ncol(z)) zz$`A1 - A2 lag` <- NA # append NA if col not added
    data.frame(uid = x[1, 1], tndx = time(zz), coredata(zz), check.names = FALSE)
}))

给出如下:

> DF
    uid    tndx A1 A2 result A1 - A2 lagged
1.1   1 1999 Q4  2  3     NA             NA
1.2   1 2000 Q1  2  2     NA             -1
1.3   1 2000 Q2  2  3     NA              0
2.1   2 1999 Q4  2  4     NA             NA
2.2   2 2000 Q1 NA NA     NA             NA
2.3   2 2000 Q2 NA NA     NA             NA
2.4   2 2000 Q3 NA NA     NA             NA
2.5   2 2000 Q4 NA NA     NA             NA
2.6   2 2001 Q1  3  4     NA             NA
3.1   3 2000 Q1  1  2     NA             NA
3.2   3 2000 Q2  1 NA     NA             -1
3.3   3 2000 Q3  1  2     NA             NA
编辑:在进一步讨论的基础上完全重做了解决方案。注意,这不仅添加了一个额外的列,而且还将索引转换为"yearqtr"类,并添加了额外的缺失行。

编辑:by函数的一些小的简化

我不完全清楚你想要什么,因为你没有包括"正确答案"。如果你想从另一个非滞后变量中减去一个滞后变量,你可以用偏移索引来做。(如果你想把结果放回数据框,你需要填充它。

 x$A1lagA2 <- ave(x[, c("A1", "A2")], x$uid, FUN=function(z) {
            with(z, c(NA, A1[2:NROW(z)] -A2[1:(NROW(z)-1)]) ) } )[[1]]
 x
  uid   tndx A1  A2 A1lagA2
1   1 1999.4  2   3      NA
2   1 2000.1  2   3      -1
3   1 2000.2  2   3      -1
4   2 1999.4 10  14      NA
5   2 2000.1 11  14      -3
6   3 2000.1  1   2      NA
7   3 2000.2  1 100      -1
8   3 2000.3  1   2     -99

当ave()参数为多列时,您确实会得到恼人的重复额外列,但我只是取了第一个。

相关内容

  • 没有找到相关文章

最新更新