如何在dplyr中链接ifelse语句

时间:2017-07-26 19:31:35

标签: r dplyr

我试图在我的一个R函数中链接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))

我只是想知道我做错了什么。任何人都可以帮忙吗?非常感谢。

2 个答案:

答案 0 :(得分: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,则可以选择在ifelse

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

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


 }

select.vars(mtcars)

答案 1 :(得分:1)

您可以使用括号中的if

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