gpt4 book ai didi

R quo_name等同于quos

转载 作者:行者123 更新时间:2023-12-04 04:33:17 25 4
gpt4 key购买 nike

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)
)
}
IE。为...中指定的所有列添加均值和求和列
,当然这只是作为示例,quos_names不存在。如果有办法的话,这将非常有帮助。
我知道可以在data.table DT[,(Col_names):=lapply(Cols,mean)]中执行类似的操作(此代码不起作用,但我之前已经执行过类似的操作)。

最佳答案

免责声明:虽然我认为@aosmith提出的mutate_at是最好,最简单的解决方案,但我认为如果不存在rlang,了解如何使用mutate_at工具解决该问题可能是有启发性的。为了科学!

如评论中所述,您将需要研究purrr::map()系列功能。您还会遇到!!!mean_names := mean(!!!exprs)的另一个问题,因为!!!拼接运算符不能在分配的左侧使用。

最好的rlang方法是将mutate表达式组成一个命名列表。使用quo执行表达式算术,并使用stringr::str_c(或您一直在做的paste0)进行字符串算术:

library( tidyverse )

my_mutate <- function(df, ...) {
exprs <- enquos(...)

mean_exprs <- set_names(
map(exprs, ~quo(mean(!!.x))), # mpg becomes mean(mpg)
str_c("mean_", map_chr(exprs, quo_name)) ) # mpg becomes "mean_mpg"

sum_exprs <- set_names(
map(exprs, ~quo(sum(!!.x))), # mpg becomes sum(mpg)
str_c("sum_", map_chr(exprs, quo_name)) ) # mpg becomes "sum_mpg"

mutate(df, !!!mean_exprs, !!!sum_exprs)
}

mtcars %>% my_mutate( mpg, cyl )
# mpg cyl disp hp ... mean_mpg mean_cyl sum_mpg sum_cyl
# 1 21.0 6 160 110 ... 20.09062 6.1875 642.9 198
# 2 21.0 6 160 110 ... 20.09062 6.1875 642.9 198
# 3 22.8 4 108 93 ... 20.09062 6.1875 642.9 198
# 4 21.4 6 258 110 ... 20.09062 6.1875 642.9 198

奖励:您将注意到,我们在上面的表达式定义中重复了一段代码。我们可以将其引入一个独立的函数中,该函数使用所提供的函数自动构造表达式并相应地命名这些表达式:
mutator <- function(f, ...) {
f_expr <- enquo(f)
exprs <- enquos(...)

## Same code as in my_mutate above, but with an arbitrary function
set_names(
map( exprs, ~quo((!!f_expr)(!!.x)) ),
str_c( quo_name(f_expr), "_", map_chr(exprs, quo_name) )
)
}

## Example usage
mutator( sd, mpg, cyl )
# $sd_mpg
# <quosure>
# expr: ^^sd(^mpg)
# env: 0x555e05260020

# $sd_cyl
# <quosure>
# expr: ^^sd(^cyl)
# env: 0x555e05273af8

现在,我们可以使用新的 mutator函数以简单的单行代码重新定义 my_mutate:
my_mutate2 <- function(df, ...) {
mutate( df, !!!mutator(mean, ...), !!!mutator(sum, ...) )
}

关于R quo_name等同于quos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com