Можно ли написать что-то вроде этого:
g <- function(method) {
dataset %>%
if (method == 1) {
mutate(boot1 = some_formula1)
} else {
mutate(boot2 = some_formula2)
}
}
a <- g(1)
Или это единственный выбор - использовать ifelse / if_else или case_when внутри мутации?
Привет, да, я здесь новенький. Я хотел опубликовать свою функцию (все это), но потом подумал, что в этом нет необходимости. Теперь вы, ребята, решили мою проблему, но в следующий раз я постараюсь опубликовать именно то, что я пытаюсь достичь. Итак, я понимаю, что нельзя использовать оператор if в середине конвейера, и я могу остановить конвейер и перезапустить его после моего оператора if.
Привет снова, теперь я включил весь свой код в другой вопрос. Подскажите пожалуйста ссылка на сайт





добро пожаловать в 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 что-то делает с кодом, поэтому функция не работает.
Пожалуйста. «Возврат» - это просто вывод результата на консоль. У меня он отлично работает с несколькими наборами данных, такими как mtcars и iris.
Привет еще раз. Я задал еще один вопрос ссылка на сайт. Когда я пытаюсь реализовать оператор if, функция не работает. В моей исходной функции я использую map2 с mutate, и мне нужен оператор if, если он находится в середине конвейера.
Я так думаю, и, может быть, это поможет. Если я хорошо понял, вам нужно добавить новый столбец в существующий набор данных (возможно, 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
Большое спасибо! Теперь ответ кажется очевидным, и моя проблема заключалась в том, что я не знал, когда начать передачу данных по конвейеру.
Еще раз привет, я не могу реализовать оператор if в своей функции. У меня постет новый вопрос ссылка на сайт. Вы можете взглянуть на это, пожалуйста?
Добро пожаловать в SO (вы все еще как бы здесь новичок :-)! Было бы полезно узнать, чего вы действительно пытаетесь достичь, с помощью полного, но минимального рабочего примера. Учитывая скудную информацию, которую вы предоставили, ответ @ Marcel_G должен помочь, но я не уверен, что мы действительно знаем, что вы пытаетесь сделать.