【问题标题】:Calculate maximum of last year observations计算去年观测值的最大值
【发布时间】:2017-10-21 09:19:15
【问题描述】:

我正在努力从去年的观察中获得变量的最大值(不是每年!)并将其实施到每一行(观察)。

我认为最好的方法是使用 rollapply 函数,但我无法弄清楚宽度应该是什么样子,因为它可能因每次观察而异(每个观察代表一天,但并非所有日子都有观察)。我知道使用 list 会产生偏移值,所以这些值看起来如何?

我得到的代码:

mutate(data,"Feature"=rollapplyr(variable,list(0,"Go back one year"),max,fill=NA))

举例说明:一行的日期为 2016 年 8 月 31 日。我希望新列(使用 dplyr 包的 mutate)在这一行中显示 variable 从 31/8/2015 到 31/8/2016(这一行)的最大值。

对于那些想要更进一步的人: 当计算出的最大值 variable 高于阈值时,不显示 variable 值 - 显示 TRUEFALSE(或 1 / 0)。

【问题讨论】:

  • 如果您提供complete minimal reproducible example 来回答您的问题,您将更有可能得到一个好的答案。我们可以从中工作并使用它来向您展示如何回答您的问题。这也使您的问题和答案在未来对其他人更有用。

标签: r rollapply


【解决方案1】:

没有更多细节很难回答。但是看看这是不是你需要的:

data=data.frame(Data=seq.Date(as.Date("2001-01-01"),as.Date("2005-12-31"),by = "month"),Var=sample(1:1000,60,TRUE))
#exclude some lines
data=data[-c(10,15,17:21),]


 # using for
    for (i  in 1:nrow(data)){ # i=1
      data$Max[i]=max(data[data$Data>(data$Data[i]-360) & data$Data<=data$Data[i],"Var"])
    }


# using rollapply
 # one year interval from dates   
    for (i  in 1:nrow(data)){ # i=1
      data$Oneyear[i]=length(data$Data[data$Data>(data$Data[i]-360) & data$Data<=data$Data[i]])
    }  

data$Maxr=rollapplyr(data$Var, data$Oneyear, max)

使用

set.seed(123)

你会得到:

> tail(data)
         Data Var Oneyear Max Maxr
55 2005-07-01 561      12 858  858
56 2005-08-01 207      12 858  858
57 2005-09-01 128      12 858  858
58 2005-10-01 754      12 858  858
59 2005-11-01 896      12 896  896
60 2005-12-01 375      12 896  896

【讨论】:

  • 谢谢@罗伯特!很有帮助!我看到你一年用了 360 天。是否可以根据观察日期将其与全年交换? (通过完整的年份,我的意思是在日期的年份中减去 1,而日期和月份保持不变。
  • 是的。而不是(data$Data[i]-360) 使用as.Date(paste(as.numeric(format(data$Data[i],"%Y"))-1,format(data$Data[i],"%m-%d"),sep="-"))
猜你喜欢
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2021-09-17
  • 2020-10-30
  • 1970-01-01
  • 2013-05-13
相关资源
最近更新 更多