Напишите функцию с вводом имени столбца по умолчанию в dplyr :: mutate () - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь написать функцию для вычисления нового столбца во фрейме данных.Я хочу, чтобы функция имела имена столбцов по умолчанию в качестве входных данных и могла вызываться изнутри dplyr::mutate().

Вот упрощенный пример, где я использую столбец с именем age для вычисления округленногоage.

library(dplyr)
# function to round age WITH DEFAULT vector/column to round
round_age <- function(age = age) {
  round(age)
}

# create dummy data
data = data.frame(age = c(50.1, 60.5))

# try to use default age column - ERROR
data %>%
  mutate(
    age_round = round_age()
  )
#> Error in mutate_impl(.data, dots): Evaluation error: non-numeric argument to mathematical function.

# specify age column to round - NO ERROR
data %>%
  mutate(
    age_round = round_age(age = age)
  )
#>    age pat_age age_round
#> 1 50.1    50.1        50
#> 2 60.5    60.5        60

Я хочу иметь возможность вызывать функцию из dplyr::mutate без указания фрейма данных.Есть идеи?Все советы с благодарностью!

Спасибо!Daniel

1 Ответ

0 голосов
/ 13 декабря 2018

Мы можем написать функцию с именем round_x(), которая охватывает mutate() и имеет age в качестве аргумента по умолчанию:

library(dplyr)

round_x <- function(.data, x = age) {
  x <- enquo(x)
  var_name <- paste0("round_", quo_name(x))
  mutate(.data, !!var_name := round(!!x))
}

Если мы вызываем эту функцию без аргументов:

data %>% round_x()
#   age round_age
#1 50.1        50
#2 60.5        60

Мы могли бы передать другие аргументы, если бы хотели:

data.frame(data, weight = c(180.5, 200.6)) %>% round_x(weight)
#   age weight round_weight
#1 50.1  180.5          180
#2 60.5  200.6          201
...