2013-09-24 24 views
1

我有如下內容的數組:如何在R中切換行?

> head(MEAN) 
1901DJF  1901JJA  1901MAM  1901SON  1902DJF  1902JJA 
-0.45451556 -0.72922229 -0.17669396 -1.12095590 -0.86523850 -0.04031273 

這應該是從1901到2009年的季節性均值時間序列的問題是,生成的列頭都嚴格按字母順序排列。然而,就季節而言,這沒有多大意義,例如, JJA(6月,7月,8月)領導MAM(3月,4月,5月)。

我該如何切換陣列的每個MAM和JJA條目?

PS:意思是產生於data.frame PDSI tapply應用

> head(pdsi) 
    date  scPDSI month seas seasyear 
1 1901-01-01 -0.10881074 Jan DJF 1901DJF 
2 1901-02-01 -0.22287750 Feb DJF 1901DJF 
3 1901-03-01 -0.12233192 Mär MAM 1901MAM 
4 1901-04-01 -0.04440915 Apr MAM 1901MAM 
5 1901-05-01 -0.36334082 Mai MAM 1901MAM 
6 1901-06-01 -0.52079030 Jun JJA 1901JJA 
> 
> MEAN <- tapply(pdsi$scPDSI, ts.pdsi$seasyear, mean, na.rm = T) 

可能還已知有一個更優雅的方式來計算季節性手段......

回答

1

您可以更改訂單因子水平的:

pdsi[["seasyear"]] = factor(pdsi[["seasyear"]], levels = c("1901DJF", "1901MAM", etc)) 
+0

也許,我不明白它...在pdsi是正確的季節順序。所以這裏沒有什麼可改變的。 – stephan

0

我覺得這是一個相當簡單的方式重新排序的手段,但是,它確實有你的數據已按時間排序的假設在數據集中。所以如果認爲這應該工作。

我也創造了一些隨機數據,而不是複製數據,但結果應該是一樣的

seasons = c("1901DJF", "1901MAM", "1901JJA") 
seasons = rep(seasons, c(2, 3, 1)) 
data = data.frame(runif(1:6), seasons) 

MEAN = tapply(data[,1], data[,2], mean) 

    1901DJF 1901JJA 1901MAM 
0.5799779 0.3724785 0.6514327 

order = unique(seasons) 
MEAN[order] 

1901DJF 1901MAM 1901JJA 
0.5799779 0.6514327 0.3724785 

這樣做是採取數據集中seasyear的順序,重新排列對象MEAN以反映該順序。再次,它假設您的數據按照時間順序排列在原始文件中,但我認爲這是一個安全的假設。如果不是這種情況,我們抱歉。

+0

經過一番思考,我認爲Paul的答案是更好的解決方案。他的解決方案將重新排序數據,以便隨後進行任何分析,因爲我的答案在每次分析後都要對數據進行重新排序。 – SamPassmore