2016-10-28 14 views
0

remove_outliersが返すベクトル[属性]をデータフレームに追加する必要があります。今、私は大きな行列を得ています。 (ループ内CBINDで) enter image description hereループでベクトルを束縛するR

を: enter image description here

電流出力である:私はそれがこの入力データフレームである大行列に

結果(下記のように)

# function to calculate IQR and upper and lower limit of given attribute 
remove_outliers <- function(attribute, na.rm = TRUE, ...) { 
    IQR_val <- quantile(attribute, probs=c(.25, .75), na.rm = na.rm, ...) 
    LF <- 1.5 * IQR(attribute, na.rm = na.rm) 
    attribute_W_NA <- attribute 
    attribute_W_NA[attribute < (IQR_val[1] - LF)] <- NA 
    attribute_W_NA[attribute > (IQR_val[2] + LF)] <- NA 
    attribute_W_NA 
} 

cleaned_data <- NULL 

for(i in 1:ncol(data_rm_val)){ 
    # cleaned data with NA entries replacing outliers 

    cleaned_data <- cbind(cleaned_data, remove_outliers(data_rm_val[,i])) 

} 

を追加する方法を試みました

であり、望ましい結果は、同じ数の行と列を持つデータフレームである必要があります。

ご協力いただければ幸いです。 PS:R and Data Scienceの初心者です。

+0

'apply(data_rm_val、2、remove_outliers)'はおそらくより速く、あなたが望むものに適していますが、 'append'ではなく' cbind'を試してみてください。 – Barker

+0

ループを使用する場合は、適切なサイズのオブジェクトを事前に割り当てるか、恐ろしいパフォーマンスが得られます。つまり、ループなしでこれを行うより良い方法があります。質問にデータを追加すると、おそらく誰かが投稿するでしょう。 – alistaire

+0

大丈夫です。私はそれを試みます。 私はcbindも試みました。私はデータフレーム(大きな行列)を持っています。 –

答えて

1

ユーザー定義関数でlapplyを使用するだけで、cbindingまたはappendingの必要性が回避されます。データフレームにlapply()を使用するときは、各列の操作を実行します。

cleaned_data <- data.frame(lapply(data_rm_val, remove_outliers)) 

は今、上記のあなたの定義関数、ベクトル型を返すremove_outliersを前提としています。常に出力ベクトルを確実にするために、vapply()が入力又はnrow(data_rm_val)に等しい長さを定義検討:(OPは、例えば、データを提供していないので)

cleaned_data <- data.frame(vapply(data_rm_val, remove_outliers, numeric(nrow(data_rm_val)))) 

上記の二つのオプションは、乱数のデータセット上で動作:

data_rm_val <- data.frame(matrix(rnorm(25),5)) 

#   X1   X2   X3   X4   X5 
# 1 0.4303766 1.8152041 0.3355174 -0.4880282 -0.63612820 
# 2 0.2876950 -0.7613642 -1.5046115 0.1821653 0.09397964 
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853 
# 4 1.4224979 -1.7940421 -0.5110736 -0.2837820 -0.24240172 
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656 1.23811458 

cleaned_data <- data.frame(lapply(data_rm_val, remove_outliers)) 

#   X1   X2   X3   X4   X5 
# 1 0.4303766   NA 0.3355174 -0.4880282 -0.63612820 
# 2 0.2876950 -0.7613642 -1.5046115 0.1821653 0.09397964 
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853 
# 4 1.4224979   NA -0.5110736 -0.2837820 -0.24240172 
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656   NA 

cleaned_data2 <- data.frame(vapply(data_rm_val, 
            remove_outliers, numeric(nrow(data_rm_val)))) 

#   X1   X2   X3   X4   X5 
# 1 0.4303766   NA 0.3355174 -0.4880282 -0.63612820 
# 2 0.2876950 -0.7613642 -1.5046115 0.1821653 0.09397964 
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853 
# 4 1.4224979   NA -0.5110736 -0.2837820 -0.24240172 
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656   NA 
+0

それは働いた。どうもありがとう!!! –

+0

素晴らしい!お役に立てて嬉しいです。解像度を確認するには、解決策に同意してください。 – Parfait

+0

残念ながら、ここで私の評判は低いです。あなたのためだけに祈ることができます。滞在祝福! –

関連する問題