带有dplyr动词的函数中的if语句

时间:2018-11-26 11:10:29

标签: r if-statement dplyr tidyverse

是否可以这样写:

g <- function(method) {
  dataset %>%
    if (method == 1) {
      mutate(boot1 = some_formula1)
    } else {
      mutate(boot2 = some_formula2)
    }
}

a <- g(1)

还是在mutate中使用ifelse / if_elsecase_when的唯一选择?

2 个答案:

答案 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