2016-07-28 6 views
1

私は、現在の値と前の2つの値の中央値を計算する列を追加しようとするデータフレームを持っています。ローリングメデイアのカラムを使用したときのエラー

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

私は次のエラー

> Error: k <= n is not TRUE 

任意の提案を得る:

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 

は、私は、次のコードを使用しましたか?

答えて

1

ここで何をしようとしているのか考えてみましょう。データフレームには8の行がありますが、追加するベクトルには6の要素しかありません。それらの要素をどの行に整列させるべきか?他の2つの場所に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

関連する問題