【发布时间】:2018-01-16 07:58:38
【问题描述】:
您好,关注Programming with dplyr 我注意到可以使用 quo_name 添加名称。我想知道如何为多个列执行此操作,例如。就像一个 quos_name 之类的。例如:
my_mutate <- function(df, expr) {
expr <- enquo(expr)
mean_name <- paste0("mean_", quo_name(expr))
sum_name <- paste0("sum_", quo_name(expr))
mutate(df,
!!mean_name := mean(!!expr),
!!sum_name := sum(!!expr)
)
}
变成
my_mutate <- function(df, ...) {
exprs <-quos(...)
mean_names <- paste0("mean_", quos_name(exprs))
sum_names <- paste0("sum_", quos_name(exprs))
mutate(df,
!!!mean_names := mean(!!!exprs),
!!!sum_names := sum(!!!exprs)
)
}
即。为 ... 中指定的所有列添加平均值和总和列 ,当然这只是一个例子,quos_names 不存在。如果有办法做到这一点,那将非常有帮助。
例如,我知道可以在 data.table DT[,(Col_names):=lapply(Cols,mean)] 中执行类似的操作(此代码不起作用,但我以前做过类似的操作)。
【问题讨论】:
-
改用
mutate_at怎么样?函数名称将作为后缀而不是前缀添加,否则会执行相同的工作。 -
@aosmith 不幸的是,这会覆盖 {.vars} 中指定的列我想创建一个新列。
-
别介意之前的评论,如果你命名 .funs 参数,它会添加一个新列。
-
我认为您所描述的内容不存在,但除了@aosmith 的评论之外,您还可以通过引用名称的向量
map,例如quos(a,b) %>% purrr::map(~my_mutate(df, !!.x)).