2017-03-12 7 views
0

이 함수는 벡터를 취하여 1 백분위 수 및 99 백분위 수 (값을 99 백분위 수로 99 백분위 수를 바꾸고, 1 백분위 수보다 낮은 값은 그 반대로 바꿉니다)로 값을 winsorize합니다. 오류없이 함수를 실행할 수는 있지만 인수로 지정된 벡터는 변경되지 않습니다. 함수 밖에서 같은 코드를 실행할 때 제대로 작동하지만 data.frame의 여러 열에서이 코드를 사용해야하므로 적용 함수를 통해 함수를 전달할 수 있기를 원합니다.벡터를 서브 세트하고 조정하는 기능

wins <- function(vect, prob = c(0.01, 0.99)){ 
    #vect is a vector with values to be winsorized 
    #prob contains top and bottom percentiles at which to winsorize data in vect 

    low_quantile <- quantile(vect, probs = prob[1], na.rm = TRUE) 
    high_quantile <- quantile(vect, probs = prob[2], na.rm = TRUE) 

    vect[vect < low_quantile] <- low_quantile 
    vect[vect > high_quantile] <- high_quantile 
} 

의견이 있으십니까?

+0

아마도 함수 내부에서 일어나는 일이 마술처럼 함수 외부의 개체에 영향을 미친다고 생각할 것입니다. 그들은하지 않습니다. 명시 적으로 vect를 반환하고 함수의 결과를 새 객체 또는 기존 객체에 지정해야합니다. – joran

답변

1

마지막 요소가 반환되도록 함수 끝에 vect을 추가하십시오.

wins <- function(vect, prob = c(0.01, 0.99)){ 
#vect is a vector with values to be winsorized 
#prob contains top and bottom percentiles at which to winsorize data in vect 

low_quantile <- quantile(vect, probs = prob[1], na.rm = TRUE) 
high_quantile <- quantile(vect, probs = prob[2], na.rm = TRUE) 

vect[vect < low_quantile] <- low_quantile 
vect[vect > high_quantile] <- high_quantile 
vect 
} 

wins(1:100) 
    [1] 1.99 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 
[19] 19.00 20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00 30.00 31.00 32.00 33.00 34.00 35.00 36.00 
[37] 37.00 38.00 39.00 40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00 50.00 51.00 52.00 53.00 54.00 
[55] 55.00 56.00 57.00 58.00 59.00 60.00 61.00 62.00 63.00 64.00 65.00 66.00 67.00 68.00 69.00 70.00 71.00 72.00 
[73] 73.00 74.00 75.00 76.00 77.00 78.00 79.00 80.00 81.00 82.00 83.00 84.00 85.00 86.00 87.00 88.00 89.00 90.00 
[91] 91.00 92.00 93.00 94.00 95.00 96.00 97.00 98.00 99.00 99.01 

편집 data.frame이 적용하는 방법에 대한 후속 질문 : 당신이 당신의 후속에 넣어 또한 단일 열 작동

df1 <- data.frame(matrix(1:200,ncol=2)) 
apply(df1,2,wins) # apply by column 
> apply(df1,2,wins) 
      X1  X2 
    [1,] 1.99 101.99 
    [2,] 2.00 102.00 
    [3,] 3.00 103.00 
    [4,] 4.00 104.00 
    [5,] 5.00 105.00 
... 

:

wins(df1$X1) 
[1] 1.99 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 
[19] 19.00 20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00 30.00 31.00 32.00 33.00 34.00 35.00 36.00 
[37] 37.00 38.00 39.00 40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00 50.00 51.00 52.00 53.00 54.00 
[55] 55.00 56.00 57.00 58.00 59.00 60.00 61.00 62.00 63.00 64.00 65.00 66.00 67.00 68.00 69.00 70.00 71.00 72.00 
[73] 73.00 74.00 75.00 76.00 77.00 78.00 79.00 80.00 81.00 82.00 83.00 84.00 85.00 86.00 87.00 88.00 89.00 90.00 
[91] 91.00 92.00 93.00 94.00 95.00 96.00 97.00 98.00 99.00 99.01 
+0

답장을 보내 주셔서 감사합니다. 어떤 이유로이 방법은 값의 범위를 정의하고 예제에서와 같이 직접 값을 전달할 때만 작동합니다. 데이터 프레임에서 벡터 열을 전달할 때 여전히 작동하지 않습니다. 데이터 프레임이 20 열로되어 있으므로 (데이터 프레임 $ rowname) WINS를 통과하면 원래 행을 인쇄 할 것으로 기대하지 않습니다. – claushojmark

+0

그것은'data.frame'과'apply'를 사용하여 저에게 효과적입니다. 내 편집을 참조하십시오. –

+0

data.frame에서'apply (df, 2, FUN)'을 사용할 필요가 거의 없습니다 - 대신'[lsv] apply'를 사용하십시오. – thelatemail