Оператор if в функции с dplyr глаголами

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

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

a <- g(1)

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

Добро пожаловать в SO (вы все еще как бы здесь новичок :-)! Было бы полезно узнать, чего вы действительно пытаетесь достичь, с помощью полного, но минимального рабочего примера. Учитывая скудную информацию, которую вы предоставили, ответ @ Marcel_G должен помочь, но я не уверен, что мы действительно знаем, что вы пытаетесь сделать.

hrbrmstr 26.11.2018 13:27

Привет, да, я здесь новенький. Я хотел опубликовать свою функцию (все это), но потом подумал, что в этом нет необходимости. Теперь вы, ребята, решили мою проблему, но в следующий раз я постараюсь опубликовать именно то, что я пытаюсь достичь. Итак, я понимаю, что нельзя использовать оператор if в середине конвейера, и я могу остановить конвейер и перезапустить его после моего оператора if.

xhr489 26.11.2018 22:22

Привет снова, теперь я включил весь свой код в другой вопрос. Подскажите пожалуйста ссылка на сайт

xhr489 27.11.2018 12:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
147
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Спасибо. Кажется, что оператор return что-то делает с кодом, поэтому функция не работает.

xhr489 26.11.2018 21:54

Пожалуйста. «Возврат» - это просто вывод результата на консоль. У меня он отлично работает с несколькими наборами данных, такими как mtcars и iris.

Marcel_G 26.11.2018 23:37

Привет еще раз. Я задал еще один вопрос ссылка на сайт. Когда я пытаюсь реализовать оператор if, функция не работает. В моей исходной функции я использую map2 с mutate, и мне нужен оператор if, если он находится в середине конвейера.

xhr489 27.11.2018 13:01
Ответ принят как подходящий

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

Большое спасибо! Теперь ответ кажется очевидным, и моя проблема заключалась в том, что я не знал, когда начать передачу данных по конвейеру.

xhr489 26.11.2018 21:59

Еще раз привет, я не могу реализовать оператор if в своей функции. У меня постет новый вопрос ссылка на сайт. Вы можете взглянуть на это, пожалуйста?

xhr489 27.11.2018 13:37

Другие вопросы по теме