【问题标题】:Reshape and mean calculation重塑和均值计算
【发布时间】:2015-07-23 12:19:00
【问题描述】:

我有全年沿海拔梯度收集的气候数据。形状像这样:

clim <- read.table(text="alti    year    month    week    day    meanTemp    maxTemp    minTemp
350     2011    aug.     31      213    10          14         6
350     2011    aug.     31      214    12          18         6
350     2011    aug.     31      215    10          11         9
550     2011    aug.     31      213    8           10         6
550     2011    aug.     31      214    10          12         8
550     2011    aug.     31      215    8           9          7
350     2011    sep.     31      244    9           10         8
350     2011    sep.     31      245    11          12         10
350     2011    sep.     31      246    10          11         9
550     2011    sep.     31      244    7.5         9          6
550     2011    sep.     31      245    8           10         6
550     2011    sep.     31      246    8.5         9          8", header=TRUE)

我正在尝试重塑这些数据,以便每个高度只有一行,并计算每个月和全年的平均数据。要是能做成这样就好了:

alti    mean_year(meanTemp)   mean_year(maxTemp)   mean_aug.(meanTemp)   mean_aug.(maxTemp)   mean_sep.(meanTemp)   [...]
350     10.333                12.667               10.667                14.3                 10                     ...
550     8.333                 9.833                8.667                 10.333               7.766                  ...

有什么想法来进行这种重塑和计算吗?

【问题讨论】:

  • 您能否将数据修改为对用户更友好的数据,以便我们可以复制/粘贴到我们自己的会话中(例如使用dput)?
  • 嗨 Roman,user198275 刚刚修改了数据,所以现在很容易粘贴到 R 中。我不知道这是可能的,太棒了! ;) R.

标签: r reshape mean temporal


【解决方案1】:

您可以使用 data.table 和 dcast:

library(data.table)

setDT(clim)

merge(

clim[, list("mean_temp_mean_year" = mean(meanTemp), "max_temp_mean_year" = mean(maxTemp)), by = alti]
,
dcast(clim[, list("mean_temp_mean" = mean(meanTemp), "max_temp_mean" = mean(maxTemp)), by = c("alti","month")], alti ~ month, value.var = c("mean_temp_mean","max_temp_mean"))
,
by = "alti")

我已经切换了一些变量的名称,你的排序并不完美,但之后可以重新排序/重命名

【讨论】:

    【解决方案2】:

    要获取月份或年份的平均值,您可以使用aggregate,后跟reshape

    两个聚合可以分开计算,然后merge把它们放在一起:

    mon <- aggregate(cbind(meanTemp, maxTemp) ~ month + alti, data=clim, FUN=mean)
    mon.wide <- reshape(mon, direction='wide', timevar='month', idvar='alti')
    
    yr <- aggregate(cbind(meanTemp, maxTemp) ~ year + alti, data=clim, FUN=mean)
    yr.wide <- reshape(yr, direction='wide', timevar='year', idvar='alti')
    

    每个.wide 集合都有您想要的数据。唯一常见的列是alti,所以我们采用merge 默认值:

     merge(mon.wide, yr.wide)
    ##   alti meanTemp.aug. maxTemp.aug. meanTemp.sep. maxTemp.sep. meanTemp.2011 maxTemp.2011
    ## 1  350     10.666667     14.33333            10    11.000000     10.333333    12.666667
    ## 2  550      8.666667     10.33333             8     9.333333      8.333333     9.833333
    

    【讨论】:

    • 此解决方案没有提供完整的答案。它仅缺少按年计算的总值。
    【解决方案3】:

    这是data.table 解决方案的另一种变体,但这需要当前的devel version, v1.9.5

    require(data.table) # v1.9.5+
    setDT(clim)
    form = paste("alti", c("year", "month"), sep=" ~ ")
    val  = c("meanTemp", "maxTemp")
    ans  = lapply(form, function(x) dcast(clim, x, mean, value.var = val))
    Reduce(function(x, y) x[y, on="alti"], ans)
    
    #    alti meanTemp_mean_2011 maxTemp_mean_2011 meanTemp_mean_aug. meanTemp_mean_sep. maxTemp_mean_aug. maxTemp_mean_sep.
    # 1:  350          10.333333         12.666667          10.666667                 10          14.33333         11.000000
    # 2:  550           8.333333          9.833333           8.666667                  8          10.33333          9.333333
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多