我正在尝试使用循环“for”编写一个函数来查找中位数。这时,这是我的功能:
mediana <- function (x,k=3){
n<-length(x)
r_med <- NULL
m <- matrix(x,n,k)
for (i in k){
r_med[i]<-apply(m,1,median)[1:(n-k+1)]
}
}
但是当我尝试探测该功能时,会出现此警告消息:
Warning message:
In r_med[i] <- apply(m, 1, median)[1:(n - k + 1)] :
number of items to replace is not a multiple of replacement length
任何人都可以帮我解决我的问题吗?我是R的初学者,我很难理解编程!
谢谢!
答案 0 :(得分:1)
如果您只是想找到一个功能,请使用rollapply
,如Roland建议的那样。如果您正在尝试自学一些编程继续阅读。
如果我理解正确,通过'运行中位数'就意味着取每个k
元素的中位数。例如:
> runif(9)
[1] 0.5889687801 0.9012693244 0.9394947358 0.3996177884 0.9639447967 0.7152831559 0.1913678751 0.7477577361 0.5264336797
如果k=3
第一个中位数为0.589, 0.901, & 0.939
,第二个0.901, 0.939, & 0.399
等等
如果是这样,您不需要apply
或matrix
语句,因为您可以为矢量编制索引。
修订后的功能如下:
mediana <- function (x,k=3){
n<-length(x)
r_med <- vector("numeric", n-k+1)
for (i in seq(n-k+1)){
r_med[i] <- median(x[i:(i+k-1)])
}
return(r_med)
}
一些编程点:
1:k
或使用seq
。组合数量为n-k+1
,因此您可以使用它。vector("numeric", n-k+1)
)return
语句是一种很好的形式。在这样一个简单的功能中,它不是一个问题,而是为了清晰起见。