我有一个面板数据,数据框有三个人,每个人有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
我该如何管理?
我看到有人已经在stackoverflow上问了同样的问题,但它在mysql中(这里是How to combine several time spans),我想知道R中是否有解决方案。(我无法读取mysql代码。 。)
提前致谢,非常感谢!
编辑:@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
答案 0 :(得分:0)
这应该适合你。
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
现在,根据您要创建的论坛数量,会更改2
中的rank(t)/2
。例如,如果您想要4个组(4/# of obs per user) = 1