是否可以这样写:
g <- function(method) {
dataset %>%
if (method == 1) {
mutate(boot1 = some_formula1)
} else {
mutate(boot2 = some_formula2)
}
}
a <- g(1)
还是在mutate中使用ifelse
/ if_else
或case_when
的唯一选择?
答案 0 :(得分:0)
欢迎使用stackoverflow。是的,可以在函数内使用dplyr-动词。这是您想要的功能:
g <- function(method, data){
if (method == 1) {
data %<>% mutate(boot1 = "A")}
else{
data %<>% mutate(boot1 = "B")
}
return(data)
}
我建议将要提供的数据转换为函数的参数以及方法的参数。之后,您可以添加任何您想要变异的内容。在我的示例中g(1, data)
将添加一个名为boot1的列,其值为“ A”。当然,您可以进行任何其他转换。
答案 1 :(得分:0)
我认为是这样,也许这会有所帮助。如果我了解得很好,则需要使用以下方法将新列添加到现有数据集(可能是data.frame
):
# some fake data
data <- data.frame(a = c(1,3,5))
g <- function(method){
if (method == 1) {
data %>% mutate(boot1 = 'some_formula1')}
else{
data %>% mutate(boot1 = 'some_formula2')
}
}
g(2)
a boot1
1 1 some_formula2
2 3 some_formula2
3 5 some_formula2
g(1)
a boot1
1 1 some_formula1
2 3 some_formula1
3 5 some_formula1
您也可以使用dplyr
将它放在您所说的if_else
链中:
method <- 1
data %>% mutate(boot1 = if_else( method == 1,'some_formula1','some_formula2' ))
或使用case_when
:
data %>% mutate(boot1 = case_when(method == 1 ~ 'some_formula1',
method == 2 ~ 'some_formula2'))
尽管它们看起来比较慢,但看着它(还添加了ifelse
):
Unit: microseconds
expr min lq mean median uq max neval cld
if 581.548 594.774 636.6556 606.7210 642.9875 980.907 100 a
if_else 729.174 747.734 852.2972 772.0545 834.3475 5406.721 100 bc
ifelse 701.441 716.587 793.0887 743.0400 793.6010 1486.934 100 b
case_when 858.454 876.161 931.2391 900.2675 936.5345 1602.134 100 c