创建统计中位数的函数

时间:2014-12-12 16:21:57

标签: r

我正在尝试使用循环“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的初学者,我很难理解编程!

谢谢!

1 个答案:

答案 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等等

如果是这样,您不需要applymatrix语句,因为您可以为矢量编制索引。

修订后的功能如下:

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. 你的循环需要迭代一些东西,比如1:k或使用seq。组合数量为n-k+1,因此您可以使用它。
  2. 正如Roland的评论中所提到的,你不应该在循环中增长对象。指定要填充的对象的大小(例如vector("numeric", n-k+1)
  3. 虽然有些风格,但提供return语句是一种很好的形式。在这样一个简单的功能中,它不是一个问题,而是为了清晰起见。