2014-12-12 5 views
0

"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

패키지 zoo에서 함수'rollapply'를 사용하십시오. 그리고'r_med'로하려고하는 것처럼 루프 안에서 객체를 성장시키지 마십시오. – Roland

답변

1

기능을 찾으려는 경우 Roland가 제안한대로 rollapply을 사용하십시오. 어떤 프로그래밍을 스스로 배우려고한다면 계속해서 읽으십시오.

정확하게 이해하면 '중간 값 실행'은 모든 k 개 요소의 중간 값을 의미합니다. 예를 들어 :

> runif(9) 
[1] 0.5889687801 0.9012693244 0.9394947358 0.3996177884 0.9639447967 0.7152831559 0.1913678751 0.7477577361 0.5264336797 

등 첫 중간 것 0.589, 0.901, & 0.939의 두 번째 0.901, 0.939, & 0.399,

그렇다면 k=3 경우 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. 루프가 반복하는 1:k 같은 또는 seq을 사용하거나 뭔가를 필요로한다. 조합 수는 n-k+1이므로 사용하십시오.
  2. Roland의 의견에서 언급했듯이 루프에서 개체를 늘리지 않아야합니다. 채우려는 객체의 크기를 지정하십시오 (예 : vector("numeric", n-k+1))
  3. 다소 문체가 있지만 return 문을 제공하는 것이 좋습니다. 이와 같은 단순한 기능에서는 많은 문제는 아니지만 명확성에 도움이됩니다.