2016-07-28 46 views
1

我有一個數據幀,我嘗試添加額外的列,計算當前值和前兩個值的中值。來自rollingmedian使用列的錯誤

Date   Value 
21/07/2016 14.8 
22/07/2016 14.9 
23/07/2016 15.8 
24/07/2016 15.0 
25/07/2016 15.7 
26/07/2016 15.6 
27/07/2016 16.1 
28/07/2016 16.1 

我用下面的代碼:

library(zoo) 
dataframe$medianval <-rollmedian(dataframe$Value,k=3) 

我收到以下錯誤

> Error: k <= n is not TRUE 

有什麼建議?

回答

1

想想R在這裏試圖做什麼。數據幀有8行,但您要追加的向量只有6元素。這些元素應該對齊到哪些行? R應該在另外兩個地方放些什麼?

library(zoo) 
dataframe <- read.table(text="Date   Value 
21/07/2016 14.8 
22/07/2016 14.9 
23/07/2016 15.8 
24/07/2016 15.0 
25/07/2016 15.7 
26/07/2016 15.6 
27/07/2016 16.1 
28/07/2016 16.1", header=TRUE) 
rollmedian(dataframe$Value,k=3) 
# [1] 14.9 15.0 15.7 15.6 15.7 16.1 
nrow(dataframe)       # [1] 8 
length(rollmedian(dataframe$Value,k=3)) # [1] 6 

因爲我能猜到你的意思(糾正我,如果我錯了),我會嘗試:

dataframe$medianval <- c(NA, NA, rollmedian(dataframe$Value,k=3)) 
dataframe 
#   Date Value medianval 
# 1 21/07/2016 14.8  NA 
# 2 22/07/2016 14.9  NA 
# 3 23/07/2016 15.8  14.9 
# 4 24/07/2016 15.0  15.0 
# 5 25/07/2016 15.7  15.7 
# 6 26/07/2016 15.6  15.6 
# 7 27/07/2016 16.1  15.7 
# 8 28/07/2016 16.1  16.1 

如果您希望能夠方便地適應這一點,你應該寫一簡單功能:

med.fun <- function(var, data, k){ 
    # Note: variable name must be in quotes 
    return(c(rep(NA, k-1), with(data, rollmedian(get(var), k=k)))) 
} 
med.fun("Value", dataframe, 5) 
# [1] NA NA NA NA 15.0 15.6 15.7 15.7 
+0

非常感謝您的幫助和澄清。會以不同於c的方式存在(NA,NA,...例如,如果我想運行測試不同中值長度的循環, – carlosmaria