【问题标题】:How to switch rows in R?如何在R中切换行?
【发布时间】:2013-09-30 10:30:42
【问题描述】:

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

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

这应该是一个时间序列,其季节性平均值从 1901 年到 2009 年。问题是生成的列标题是严格按字母顺序排列的。但是,就季节而言,这没有多大意义,例如JJA(六月、七月、八月)领先 MAM(三月、四月、五月)。

如何切换数组的每个 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)

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

【问题讨论】:

    标签: r dataframe apply mean


    【解决方案1】:

    您可以更改因子水平的顺序:

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

    【讨论】:

    • 也许,我不明白...在 pdsi 中,季节的顺序是正确的。所以这里没什么可改变的。
    【解决方案2】:

    我认为这是对您的均值进行重新排序的一种相当简单的方法,但是,它确实假设您的数据已经在数据集中按时间顺序排列。因此,如果这成立,这应该有效。

    我也创建了一些随机数据,而不是复制你的数据,但是结果应该是一样的

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

    【讨论】:

    • 经过一番思考,我认为保罗的回答是一个更好的解决方案。他的解决方案将为您随后想要进行的任何分析重新排序数据,而我的回答将必须在每次分析后重新排序数据。
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多