如何在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))
我只是想知道我做错了什么。任何人都可以帮忙?非常感谢。
答
为逻辑向量是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)
答
您可以使用if
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
[使用管道操作者%>%,当R的条件评价](的
可能的复制https://stackoverflow.com/questions/30604107/r-conditional-evaluation-when-using-the-管道运营商) – HubertL
是的,purrr :: when(在HubertL的链接中)是我惯用的方式。这就是当我提出类似问题时我指出的问题https://github.com/tidyverse/magrittr/issues/91 – Frank