如何在dplyr中链接ifelse语句

如何在dplyr中链接ifelse语句

问题描述:

我试图在我的一个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

为逻辑向量是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

您可以使用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