оператор if в функции с глаголами dplyr - PullRequest
0 голосов
/ 26 ноября 2018

Можно ли написать что-то вроде этого:

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

a <- g(1)

Или единственный вариант использовать ifelse / if_else или case_when внутри мутирования?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я так думаю, и, возможно, это могло бы помочь.Если я хорошо понял, вам нужно добавить новый столбец в существующий набор данных (возможно, 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
0 голосов
/ 26 ноября 2018

добро пожаловать в 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».Конечно, вы могли бы к любой другой трансформации.

...