【问题标题】:daily average after applying diff应用差异后的每日平均值
【发布时间】:2016-05-25 22:38:56
【问题描述】:

我有一个包含 3 小时值的数据集,我想计算每日平均值,但我必须对 2 个连续时间步长之间的差异进行计算。这是我的数据样本:

      prec=
      c(5068.51904296875, 5068.53076171875, 5068.5654296875, 5068.5927734375, 
      5068.60107421875, 5068.60107421875, 5068.60107421875, 5068.60205078125, 
      5068.6123046875, 5068.6171875, 5068.6171875, 5068.6171875, 5068.6171875, 
      5068.6171875, 5068.6171875, 5068.6171875, 5068.61865234375, 5068.646484375, 
      5068.662109375, 5068.6669921875, 5068.67138671875, 5068.6728515625, 
      5068.7138671875, 5068.74169921875)

      days=
      structure(c(7670, 7670, 7670, 7670, 7670, 7670, 7670, 7670, 7671, 
      7671, 7671, 7671, 7671, 7671, 7671, 7671, 7672, 7672, 7672, 7672, 
      7672, 7672, 7672, 7672), class = "Date")

所以,我不得不这样做:

    dfprec <- diff(prec,lag=1)

我的问题是,我现在怎么能得到每日的手段?我可以使用aggregatetapply..但现在dfprec 在几天内少了一个“时间”...... 有什么建议吗?

【问题讨论】:

  • 您必须添加一个 NA:c(NA, dfprec)c(dfprec, NA) 才能获得与原始向量相同的长度。
  • 你能指定每天限时的行为吗?您是否希望将每个差异归因于上一个或下一个时间步?或者可能不考虑每天的第一个或最后一个差异?

标签: r


【解决方案1】:

为什么需要保持向量的大小?

这似乎工作正常:

res <- tapply(prec, days, function(p) {mean(diff(p))})
res
#   1991-01-01   1991-01-02   1991-01-03 
# 0.0118582589 0.0006975446 0.0175781250 

【讨论】:

  • 我认为没有必要每天丢弃第一次测量。我可能会做tapply(c(NA, diff(prec)), days, FUN = mean, na.rm=TRUE)
  • 它会改变结果吗?
  • 是的,确实如此,因为它使用了在这里抛出的观察结果(一天的第一个 obs 和前一天的最后一个 obs 之间的差异)。
  • 谢谢,这正是我想要的;这种方式似乎对我有用。非常感谢!
【解决方案2】:

使用库 data.table 中的 shift 函数:

DT1 = data.table(prec,days)

DT1[,dprec := prec - shift(prec,1), by=days][,mean(dprec,na.rm = TRUE),by=days]

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多