2016-09-28 16 views
1

私は自分のデータフレームの異常値を検出し、異常値をNAsに置き換えようとしています。 私はここに提供されている機能を少し変更しました: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を使用します。

関連する問題