2017-10-21 22 views
0

爲了從去年的觀測值(不是每年!)中獲取變量的最大值,並將其實施到每一行(觀測值),我非常努力。計算去年觀測值的最大值

我認爲最好的方法是使用rollapply函數,但我無法弄清楚寬度應該是什麼樣子,因爲每個觀察結果可能會有所不同(每個觀察結果代表一天,但並非所有天都有觀察結果)。我知道使用列表會產生偏移值,所以這些值看起來如何?

我得到的代碼:一排具有31/8/2016日期:爲了澄清

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

實施例。我希望新列(使用dplyr包的mutate)在此行中顯示從2015年8月31日到2016年8月31日(此行)的最大值variable

對於那些誰想要更進一步: 代替顯示所述variable值 - 顯示TRUEFALSE(或1/0)計算出的最大時variable高於閾值。

+1

它更可能你會得到一個很好的答案,如果你提供一個[完成最小可重現的例子](http://stackoverflow.com/help/mcve)去解決你的問題。我們可以從中學習並使用它來向您展示如何回答您的問題。這也使你的問題和答案在未來對其他人更有用。 –

回答

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 
+0

謝謝@Robert!非常有幫助! 我看到你一年使用了360天。 根據觀察日期可以全年交換嗎? (完整的一年,我的意思是當日的年份減1,而日和月保持不變) –

+0

是的,而不是'(data $ Data [i] -360)'使用'as.Date(粘貼(as。數字(格式(數據$數據[I]中, 「%Y」)) - 1,格式(數據$數據[I]中, 「%間 - %d」),九月= 「 - 」))' – Robert