2017-07-26 191 views
2

我試圖在我的一個R函數中鏈接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

可能的複製https://stackoverflow.com/questions/30604107/r-conditional-evaluation-when-using-the-管道運營商) – HubertL

+0

是的,purrr :: when(在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和選擇是使用內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

謝謝。這樣可行。後續問題。如果我想要選擇的變量數量在兩種情況下有所不同,該怎麼辦? – zesla

1

您可以使用ififelse封閉在括號中:

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 
[使用管道操作者%>%,當R的條件評價](的
+0

輸出看起來很古怪...如何返回一個數據框? – zesla

+0

對!我編輯了我的答案 – HubertL

+0

我想'df%>%{if(cond)select(。,mpg,wt)else select(。,hp,wt)}'should also work – akrun