2017-07-25 8 views
0

私のデータから異常値を除外しようとしています。ここに私のデータから頭がある:私は私が探しています結果を得る(リスト)は、dplyrで関数内で二重に強制することはできません

lidar_summary_5_max_height_outlier_filter <- lidar_summary_5 %>% 
    filter(max_height <= mean(max_height)+2*sd(max_height) | max_height >= mean(max_height) - 2*sd(max_height)) 

:私は、次のコードを使用

X tile resolution topo max_height mean_height rugosity vertical_diversity openness 
1 9 1   5 high 19.41845 10.244725 5.533991   0.7931086 10.049369 
2 21 10   5 high 22.49638 13.684197 5.707197   0.7863063 5.613547 
3 33 11   5 high 16.96429 9.886287 4.190133   0.7471749 11.596492 
4 45 12   5 high 19.83373 10.516013 5.297644   0.8006827 6.116738 
5 57 13   5 high 21.69734 12.872438 6.009529   0.7797255 5.602573 
6 69 14   5 high 23.77329 15.121994 5.777413   0.7651389 4.814283 

。しかし、私はいくつかの繰り返しを行っているので、いくつかの変数max_height, mean_height, rugosity, vertical_diversity, opennessとそれぞれ異なるデータファイルに渡すことができる関数を作成しようとしています。

outlier_filter <- function(dat, col){ 
    dat %>% 
    dplyr::filter(col <= (mean(col)+2*sd(col)) | col >= (mean(col) - 2*sd(col))) 
} 
datは、データフレームの名前で

colは私がから外れ値を削除しています変数です:私は次の関数を作りました。

Error in is.data.frame(x) : 
(list) object cannot be coerced to type 'double' 

と警告:私はこの機能を実行すると、私は次のエラーを取得

In addition: Warning message: 
In mean.default(col) : argument is not numeric or logical: returning NA 

を私は別に、これらのエラーを検索しようとしましたが、私が見つけた解決策は、この場合には役立ちませんでした。メソッドが関数の外部でうまく動作するが、関数では機能しないので、何が起きているのか分かりません。

+1

あなたは[こちら] dplyrプログラミングビネットに興味があるかもしれません(https://cran.r-project.org/web/パッケージ/ dplyr/vignettes/programming.html) – aosmith

+0

ありがとう!それは問題のようです。ベースRでこれを行うほうが簡単でしょうか? – thatsciencegal

答えて

1

outlier_filter関数の引数colは、非標準的なコンテキストで評価する必要があります。ここではそれを行うための一つの方法は、dplyrビネットとプログラミングの線に沿って、です:

outlier_filter <- function(dat, col){ 
    col <- enquo(col) 
    dat %>% 
    dplyr::filter(!!col <= (mean(!!col)+2*sd(!!col)) | !!col >= (mean(!!col) - 2*sd(!!col))) 
} 
関連する問題