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
我有一个面板数据,数据框有三个人,每个人有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