如何在R中切换行?

时间:2013-09-24 08:03:38

标签: r dataframe apply mean

我有一个包含以下内容的数组:

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

这应该是从1901年到2009年的季节性平均值的时间序列。问题是生成的列头严格按字母顺序排列。然而,就季节而言,这并没有多大意义,例如: JJA(7月,7月,8月)领导MAM(3月4日,5月)。

如何切换阵列的每个MAM和JJA条目?

PS:MEAN是在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)

可能还有一种更为优雅的计算季节性方法的方法......

2 个答案:

答案 0 :(得分:1)

您可以更改因子级别的顺序:

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

答案 1 :(得分: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以反映该顺序。同样,它假设您的数据在原始文件中按时间顺序排序,但我认为这是一个安全的假设。如果不是这样,请道歉。