使用dplyr :: mutate()中的默认列名输入编写函数

时间:2018-12-13 17:58:24

标签: r dplyr tidyverse

我正在尝试编写一个函数来计算数据帧中的新列。我希望该函数将默认列名作为输入,并能够在dplyr::mutate()中调用。

这是一个简化的示例,其中我使用名为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内部调用该函数而无需指定数据帧。有任何想法吗?所有提示大加赞赏!

谢谢! 丹尼尔

1 个答案:

答案 0 :(得分:2)

我们可以编写一个名为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