2011-05-19 45 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