R:如何组合多个时间段

R: How to combine several time periods

我有一个面板数据,数据框有三个人,每个人有4个时期的观察,

    test.data <- data.frame(
            id = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
            t = rep(1:4, 3), var1 = runif(12), var2 = runif(12)
    )

应该是这样的

        id  t   var1    var2
    1   1   1   0.2851789   0.66365753
    2   1   2   0.6630548   0.07679873
    3   1   3   0.9000371   0.17182666
    4   1   4   0.8782424   0.11931904
    5   2   1   0.2642084   0.70807513
    6   2   2   0.9993678   0.48880088
    7   2   3   0.5662814   0.49188144
    8   2   4   0.7335935   0.74017649
    9   3   1   0.9868327   0.32792638
    10  3   2   0.5388366   0.05465845
    11  3   3   0.8814602   0.45199318
    12  3   4   0.9066551   0.89814063

现在想取连续两个时间段的平均值(即把t=1和t=2合并为一个时间段,取两者的平均值),缩短时间序列到 2 个时期。结果应该是这样的

        id  t   var1    var2
    1   1   1   0.4495637   0.88822370
    2   1   2   0.2770255   0.68399219
    3   2   1   0.8125967   0.15395440
    4   2   2   0.6232424   0.02663445
    5   3   1   0.8965059   0.79910001
    6   3   2   0.1109559   0.47906885

我该如何管理?

我在Whosebug上看到有人问过同样的问题,不过是在mysql(这里是How to combine several time spans),不知道R里面有没有解决办法。(看不懂mysql代码..)

在此先致谢,非常感谢!

EDIT: @dimitris_ps 已经给出了问题的答案,不知是否有更通用的解决方案。如果数据框如下所示并且有 50 个变量怎么办?

        id  t   var1    var2
    1   1   1991    0.3900957   0.49582924
    2   1   1992    0.1157777   0.50907756
    3   1   1993    0.1358916   0.05172451
    4   1   1994    0.2608382   0.25032905
    5   2   1991    0.8958081   0.97127891
    6   2   1992    0.2265558   0.73085533
    7   2   1993    0.2310969   0.63263599
    8   2   1994    0.4302372   0.48394795
    9   3   1991    0.7823354   0.75783991
    10  3   1992    0.3295121   0.78468692
    11  3   1993    0.2771166   0.59183611
    12  3   1994    0.1905194   0.64325034

这应该适合你。

library(dplyr)

test.data %>% mutate(t=ceiling(t/2)) %>% group_by(id, t) %>% 
  summarise(var1=mean(var1), var2=mean(var2)) %>% ungroup

此外,当您创建随机数时,请使用 set.seed(x),其中 x 是某个数字,之前,即

set.seed(123)
test.data <- data.frame(
        id = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
        t = rep(1:4, 3), var1 = runif(12), var2 = runif(12)
)

更新

更通用的解决方案

test.data %>% group_by(id) %>% arrange(t) %>% mutate(t=ceiling(rank(t)/2)) %>% 
  group_by(id, t) %>% summarise(var1=mean(var1), var2=mean(var2)) %>% ungroup

现在,根据您要创建的组数更改 rank(t)/2 中的 2。例如,如果您想要 4 个组,请输入 (4/# of obs per user) = 1