2017-04-10 8 views
3

Rのサブセットの値をTidyverseに置き換えるにはどうすればよいですか? Iが0に30より全てspeed低く変更したい場合、私は以下のコマンドを使用することができ、一例としてcarsデータを用いRのサブセットをTidyverseに置き換える

Tidyverse

cars[cars["speed"] < 30,] <- 0 

を、一方は同じサブセットを生成することができますより読みやすいコマンドで:

cars %>% filter(speed < 30) %>% mutate(speed =0) 

しかし、これは我々がcarsから取り出してきたデータのサブセットではなく、cars内の観測値の値を変更しています。

私は明らかに何かを見逃しているかもしれませんが、Tidyverseでも同じことをする直感的な方法がありますか?ほとんどの場合、cars[cars["speed"] < 30,] <- 0は正常に動作しますが、5つ以上の条件を満たすと、実際には扱いにくくなります。

+0

私は、これはあなたがすべては「整頓」にしようではないSHLDケースかもしれないと思います。 'replace'はちょうど' x [list] < - values'です。これはあなたがやったことであり、IMOです - 読みやすく、抽象度が低いものです。 – hrbrmstr

答えて

5

あなたはreplace機能を使用できます。

cars %>% mutate(speed = replace(speed, speed < 30, 0)) 

ifelse条件でも動作します:

cars %>% mutate(speed = ifelse(speed < 30, 0, speed)) 

私は一万人の行のデータフレームでこれをテストし、replaceおよそ1で実行されていました第9回はifelseです。

library(microbenchmark) 

set.seed(2) 
dat = data.frame(x=runif(1e6, 0, 1000), y=runif(1e6, 0, 1000)) 

microbenchmark(
    replace=dat %>% mutate(x=replace(x, x<200, 0)), 
    ifelse=dat %>% mutate(x=ifelse(x<200, 0, x)), 
    times=20 
) 
Unit: milliseconds 
    expr  min  lq  mean median  uq  max neval cld 
replace 9.553371 10.32223 13.74662 10.99693 17.41123 21.98736 20 a 
    ifelse 85.785029 93.09105 196.69298 98.71720 320.97928 333.57374 20 b 
関連する問題