2017-11-17 8 views
0

大きなデータフレーム(104029 x 142)があります。複数の列パターンによる効率的なフィルタ行

複数の特定の列名でvalue>0の行をフィルタリングする必要があります。

df 
     word abrasive abrasives abrasivefree abrasion slurry solute solution .... 
1 composition  -0.2  0.2   -0.3 -0.40 0.2  0.1   0.20 .... 
2  ceria  0.1  0.2   -0.4 -0.20 -0.1  -0.2   0.20 .... 
3  diamond  0.3  -0.5   -0.6 -0.10 -0.1  -0.2  -0.15 .... 
4  acid  -0.1  -0.1   -0.2 -0.15 0.1  0.3   0.20 .... 
.... 

は、今私は何をするfilter()機能を使用しようとしました、それはOKです。

しかし、私はこの方法が私にとっては効率的ではないと思います。

各列名を定義する必要があるため、プロセスを維持する必要があるときには大変な作業になります。

column_names <- c("agent", "agents", "liquid", "liquids", "slurry", 
        "solute", "solutes", "solution", "solutions") 

df_filter <- filter(df, agents>0 | agents>0 | liquid>0 | liquids>0 | slurry>0 | solute>0 | 
        solutes>0 | solution>0 | solutions>0) 

df_filter 
     word abrasive abrasives abrasivefree abrasion slurry solute solution .... 
1 composition  -0.2  0.2   -0.3 -0.40 0.2  0.1   0.20 .... 
2  ceria  0.1  0.2   -0.4 -0.20 -0.1  -0.2   0.20 .... 
4  acid  -0.1  -0.1   -0.2 -0.15 0.1  0.3   0.20 .... 
.... 

もっと効率的なやり方はありますか?

+1

あなたは 'dplyr' –

答えて

1

使用dplyr::filter_at()

library(dplyr) 

df_filter <- df %>% 
    filter_at(
     # select all the columns that are in your column_names vector 
     vars(one_of(column_names)) 
     # if any of those variables are greater than zero, keep the row 
     , any_vars(. > 0) 
    ) 
2

この行は、あなたが次にあなたは私がdplyrでよりよいものがあると確信している

df[filter_condition, ] 

を使用することができます

filter_condition <- apply(df[ , column_names], 1, function(x){sum(x>0)})>0 

をテストしている状態のためのFALSE TRUE /のベクトルを返します。あなたには、いくつかの機能を選択するためにselect()スタイルのヘルパーを使用することができます

+0

すごい〜それの仕事から' filter_if'と 'filter_at'を見ている必要があります!非常に効率的です。あなたの素早い答えに感謝します。 – Eva

関連する問題