我正在尝试编写一个函数来计算数据帧中的新列。我希望该函数将默认列名作为输入,并能够在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
内部调用该函数而无需指定数据帧。有任何想法吗?所有提示大加赞赏!
谢谢! 丹尼尔
答案 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