问题描述
||
我有一个data.frame面板格式(国家/地区),我需要按国家/地区和每五年计算一个变量的平均值。因此,我只使用了\'reshape \'包中的\'cast \'函数,它起作用了。现在,我需要将此信息(平均值为quinquennium)放入旧的data.frame中,以便可以进行一些回归。我怎样才能做到这一点?下面我提供一个示例来说明我想要的内容:
set.seed(2)
fake= data.frame(y=rnorm(20),x=rnorm(20),country=rep(letters[1:2],each=10),year=rep(1:10,2),quinquenio= rep(rep(1:2,each=5),2))
fake.m = melt.data.frame(fake,id.vars=c(\"country\",\"year\",\"quinquenio\"))
cast(fake.m,country ~ quinquenio,mean,subset=variable==\"x\",na.rm=T)
现在,一切都很好,我得到了我想要的东西:x和y的平均值,按国家和每五年一次。现在,我想将它们放回data.frame伪造文件中,如下所示:
y x country year quinquenio mean.x
1 -0.89691455 2.090819205 a 1 1 0.8880242
2 0.18484918 -1.199925820 a 2 1 0.8880242
3 1.58784533 1.589638200 a 3 1 0.8880242
4 -1.13037567 1.954651642 a 4 1 0.8880242
5 -0.08025176 0.004937777 a 5 1 0.8880242
6 0.13242028 -2.451706388 a 6 2 -0.2978375
7 0.70795473 0.477237303 a 7 2 -0.2978375
8 -0.23969802 -0.596558169 a 8 2 -0.2978375
9 1.98447394 0.792203270 a 9 2 -0.2978375
10 -0.13878701 0.289636710 a 10 2 -0.2978375
11 0.41765075 0.738938604 b 1 1 0.2146461
12 0.98175278 0.318960401 b 2 1 0.2146461
13 -0.39269536 1.076164354 b 3 1 0.2146461
14 -1.03966898 -0.284157720 b 4 1 0.2146461
15 1.78222896 -0.776675274 b 5 1 0.2146461
16 -2.31106908 -0.595660499 b 6 2 -0.8059598
17 0.87860458 -1.725979779 b 7 2 -0.8059598
18 0.03580672 -0.902584480 b 8 2 -0.8059598
19 1.01282869 -0.559061915 b 9 2 -0.8059598
20 0.43226515 -0.246512567 b 10 2 -0.8059598
我感谢正确方向上的任何提示。提前致谢。
ps .:之所以需要这样做,是因为我将使用五年一次的数据进行回归,并且对于某些变量(例如人均收入),我拥有所有年份的信息,因此我决定将它们的平均值平均为5年。
解决方法
我敢肯定,有一个简单的方法可以通过重塑来做到这一点,但我的大脑首先默认为
plyr
:
require(plyr)
ddply(fake,c(\"country\",\"quinquenio\"),transform,mean.x = mean(x))
这是非常骇人听闻的,但是使用重塑的一种方法可以构建您之前的工作:
zz <- cast(fake.m,country ~ quinquenio,mean,subset=variable==\"x\",na.rm=T)
merge(fake,melt(zz),by = c(\"country\",\"quinquenio\"))
尽管我很肯定必须要有一个更好的解决方案。
,这是使用tapply
,ave
和with
的更传统的方法
fake$mean.x <- with(fake,unlist(tapply(x,list(country,quinquenio),ave)))