2017-07-26 21 views
2

私のR関数の1つでifelse文を連鎖しようとしていました。基本的に私は何をしたいです:dplyrでifelse文を連鎖する方法

do.something <- function (df, cond=TRUE){ 
    df %>% ifelse(cond, do something, do something else) 
} 

例として使用mtcarsデータセット:

select.vars <- function (df, cond=TRUE){ 
     df %>% ifelse(cond, select(., mpg,wt), select(., hp, wt)) 
    } 

    select.vars(mtcars) 

エラーメッセージ:

Error in ifelse(., cond, select(., mpg, wt), select(., hp, wt)) : unused argument (select(., hp, wt)) 

私はちょうど私が間違っていたのだろうか。誰でも助けることができますか?どうもありがとう。

+1

可能な重複([R条件評価パイプ演算子%>%使用] https://stackoverflow.com/questions/30604107/r-conditional-evaluation-when-using-the- pipe-operator) – HubertL

+0

ええ、purrr ::(HubertLのリンクで)慣用的な方法だと思います。それは私が同様の質問をしたときに私が指摘していたものです。https://github.com/tidyverse/magrittr/issues/91 – Frank

答えて

3

論理ベクトルがlength 1であるように、我々はif/else条件

select.vars <- function (df, cond=TRUE){ 
    if(cond){ 
     df %>% 
      select(mpg, wt) 
    } else { 
     df %>% 
      select(hp, wt) 
} 
} 

select.vars(mtcars) 

を使用することができますこの目的のためにif/elseを使用することをお勧めしますが、私たちはifelseとオプションを必要とする場合に使用するだろうあなたはifを使用することができますselect

select.vars <- function (df, cond=TRUE){ 

     df %>% 
     select(ifelse(rep(cond, 2), c('mpg', 'wt'), c('hp', 'wt')))  


} 

select.vars(mtcars) 
+0

ありがとうございました。私はif/else条件でそれを行う方法を知っています。とにかくifelseをチェーンすることができれば、私は他の操作を連鎖させることができます。 – zesla

+0

@zesla私は 'ifelse'オプションで更新しました – akrun

+0

ありがとうございました。それは動作します。フォローアップの質問。 2つの条件で選択したい変数の数が異なる場合はどうなりますか? – zesla

1

ifelseは同封します括弧内:

select.vars <- function (df, cond=TRUE){ 
    df %>% {`if`(cond, select(., mpg,wt), select(., hp, wt))} 
} 
select.vars(mtcars) 
        mpg wt 
Mazda RX4   21.0 2.620 
Mazda RX4 Wag  21.0 2.875 
Datsun 710   22.8 2.320 
Hornet 4 Drive  21.4 3.215 
Hornet Sportabout 18.7 3.440 
Valiant    18.1 3.460 
Duster 360   14.3 3.570 
Merc 240D   24.4 3.190 
Merc 230   22.8 3.150 
Merc 280   19.2 3.440 
Merc 280C   17.8 3.440 
Merc 450SE   16.4 4.070 
Merc 450SL   17.3 3.730 
Merc 450SLC   15.2 3.780 
Cadillac Fleetwood 10.4 5.250 
Lincoln Continental 10.4 5.424 
Chrysler Imperial 14.7 5.345 
Fiat 128   32.4 2.200 
Honda Civic   30.4 1.615 
Toyota Corolla  33.9 1.835 
Toyota Corona  21.5 2.465 
Dodge Challenger 15.5 3.520 
AMC Javelin   15.2 3.435 
Camaro Z28   13.3 3.840 
Pontiac Firebird 19.2 3.845 
Fiat X1-9   27.3 1.935 
Porsche 914-2  26.0 2.140 
Lotus Europa  30.4 1.513 
Ford Pantera L  15.8 3.170 
Ferrari Dino  19.7 2.770 
Maserati Bora  15.0 3.570 
Volvo 142E   21.4 2.780 
+0

出力は奇妙に見えます...データフレームを返すには? – zesla

+0

右私は私の答えを編集しました – HubertL

+0

私は 'df%>%{if(cond)select(。、mpg、wt)else select(。、hp、wt)}'も動作するはずです – akrun

関連する問題