2016-09-28 3 views
1

데이터 프레임에서 이상 치를 찾아 내고 NISA로 치를 대체하려고합니다. 여기 제공된 기능을 약간 수정했습니다 : How to repeat the Grubbs test and flag the outliers. 벡터에 대한 함수를 시도하면 멋지지만, 문제는 데이터 프레임에 사용할 때입니다. 이 함수는 특이 치를 검출하지만 결과를 데이터 프레임으로 가져 오는 방법을 알지 못합니다.색인을 사용하여 df의 값 바꾸기

결과적으로 원래 데이터 프레임이 NA으로 바뀝니다. 여기서 NA은 검출 된 아웃 라이어가됩니다.

내가 지금까지 시도 무엇 :

library(outliers) 
data("rock") 

# Function to detect outliers with Grubbs test in a vector 
grubbs.flag <- function(vector) { 
outliers <- NULL 
test <- vector 
grubbs.result <- grubbs.test(test) 
pv <- grubbs.result$p.value 
# throw an error if there are too few values for the Grubb's test 
if (length(test) < 3) stop("Grubb's test requires > 2 input values") 
while(pv < 0.05) { 
outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3])) 
test <- vector[!vector %in% outliers] 
# stop if all but two values are flagged as outliers 
if (length(test) < 3) { 
    warning("All but two values flagged as outliers") 
    break 
} 
grubbs.result <- grubbs.test(test) 
pv <- grubbs.result$p.value 
idx.outlier <- which(vector %in% outliers) 
na.vect <- replace(vector, idx.outlier, NA) 

} 
return(na.vect) 
} 

# Function to detect outliers with Grubbs test in a dataframe 
Grubbs.df <- function(data){ 
grubbs.data <- (as.vector(unlist(apply(data, grubbs.flag)))) 
return(grubbs.data) 
} 

모든 아이디어를 어떻게이 일을하기 위해?

+0

스크립트 끝 부분에 적용 및 as.vector와 관련이 있다고 생각합니다. 내 노트북에서 실행하고 무슨 일이 일어나는지 보자. – Ansjovis86

답변

4

당신은 while 루프 전에 반드시 추가해야합니다 : 그것은 사전에 중단하는 경우, 귀하의 na.vect이 존재하지 않으며, 따라서 오류가 발생합니다

na.vect <- test 

때문입니다. 그런 다음 데이터 프레임에서 다음과 같이 실행하십시오.

apply(rock,2,grubbs.flag) 

두 번째 인수 2는이를 데이터 프레임의 열에 적용하도록 지시합니다. 행에 1을 사용하십시오.

관련 문제