2011-05-19 47 views
1

我有一个面板格式(country-year)的data.frame,我需要根据国家和地区计算变量的平均值每五年一次。所以我只是使用'reshape'软件包中的'cast'功能,它工作。现在我需要将这些信息(五分位数的平均值)放在旧数据框架中,这样我可以运行一些回归。我怎样才能做到这一点?下面我提供了一个例子来ilustrate我想要什么:如何将重塑包的转换函数获取的信息重新放回原始数据框R

现在
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) 

,一切都很好,我得到了我wantted: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年。

回答

3

我敢肯定有一个简单的方法与重塑做到这一点,但我的大脑默认为plyr第一:

require(plyr) 
ddply(fake, c("country", "quinquenio"), transform, mean.x = mean(x)) 

这是相当的hackish,但单程要使用重塑构建了你早期的作品:

zz <- cast(fake.m, country ~ quinquenio, mean, subset=variable=="x", na.rm=T) 
merge(fake, melt(zz), by = c("country", "quinquenio")) 

虽然我是积极的,但必须有更好的解决方案。

+0

我使用ddply喜欢你的解决方案!这似乎更容易!我会稍微等一下,但我想我会接受你的答案。再次感谢。 – 2011-05-19 23:20:43

+0

这似乎是一个明确的案例分裂,适用,结合我 - 但有多种方法来剥皮猫!很高兴这是有帮助的。 – Chase 2011-05-19 23:26:42

2

下面是使用tapplyave更老派的做法,with

fake$mean.x <- with(fake, unlist(tapply(x, list(country, quinquenio), ave))) 
+1

感谢您的回答。一般来说,我不喜欢在R中使用列表,因为我不太了解它们。但无论如何,很高兴知道。我也投了赞成票(因为赞成投票使用而欢呼)。 – 2011-05-20 17:45:52

+0

@Manoel - +1为参考批准投票,但后来注意到你有一个聚sci的背景,所以并不奇怪! – Chase 2011-05-20 19:33:45