2017-09-28 2 views
0

연속/정수 변수에 대해 누락 값을 대체하는 평균을 사용하고 범주 변수에 대해 누락 값을 대체하기 위해 모드를 사용하는 함수를 작성해야합니다.누락 된 값을 평균 및 모드로 바꾸기 (사용자 정의 함수)

데이터 I는 모드 기능이 내장 된 데이터 세트의 첫 번째 열 요소 유형, 두 번째 및 세 번째 열의 숫자이다이다

X <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/credit-screening/crx.data", header = FALSE, na.strings = '?') 

.....

신용 검사 세트로부터 온다

mode_function <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

의도 한대로 작동합니다. 내가 데이터 세트에서 사용하고

전체 기능은

broken <- function(data){ 
    for(i in 1:ncol(data)){ 
    if(is.factor(data[,i])){ 
     data[is.na(data[,i]),i] <- mode_function(data[,i]) 
    } 
    else{ 
     data[is.na(data[,i]),i] <- mean(data[,i], na.rm = TRUE) 
    } 
    } 
    return(data) 
} 

문제 :이 기능을 실행하고 아무것도 내 데이터 세트에서 변경되지 않습니다. 함수가 실행되기 전과 동일한 값의 누락 된 값이 있습니다.

기능 밖의이 줄은 의도 한대로 작동합니다. 평균을 다루는 코드와 동일합니다.

data[is.na(data[,i]),i] <- mode_function(data[,i]) 

하지만 한 번 동일한 기능을 사용하여 동일한 작업을 수행하려고하면 아무 일도 일어나지 않습니다.

+0

[재현 가능한 예] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)와 예상되는 결과를 주면 도움이되기 쉽습니다. –

답변

0

"아무 일도 일어나지 않는"가장 큰 이유는 결과를 R 이름/기호에 할당하지 못하는 것입니다. 아마도이 시도 :

maybe_res <- broken(data) 

Chaeck이 :

> sapply(X, function(x) sum(is.na(x))) 
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 
12 12 0 6 6 9 9 0 0 0 0 0 0 13 0 0 
> sapply(broken(X), function(x) sum(is.na(x))) 
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

내가 그 모드 기능이 원하는 무엇을하지 않을 수 있습니다 답변을 제공 악명을 경고한다.

관련 문제