gpt4 book ai didi

r - 使用 dplyr 进行函数式编程

转载 作者:行者123 更新时间:2023-12-03 16:53:44 25 4
gpt4 key购买 nike

通过在使用 dplyr 的函数中使用非标准评估,寻找一种更有效/优雅的方式将多个参数传递给组。我不想使用 ... 运算符,而是要单独指定函数。

我的具体用例是一个函数,它接受一个数据框并使用更简单的语法创建一个 ggplot 对象。这是我想用我的函数自动化的代码示例:

# create data frame
my_df <- data.frame(month = sample(1:12, 1000, replace = T),
category = sample(head(letters, 3), 1000, replace = T),
approved = as.numeric(runif(1000) < 0.5))

my_df$converted <- my_df$approved * as.numeric(runif(1000) < 0.5)

my_df %>%
group_by(month, category) %>%
summarize(conversion_rate = sum(converted) / sum(approved)) %>%
ggplot + geom_line(aes(x = month, y = conversion_rate, group = category,
color = category))

我想将 group_by、summary、ggplot 和 geom_line 组合成一个简单的函数,我可以为 x、y 和 group 提供数据,并让它在幕后执行所有肮脏的工作。这是我开始工作的内容:
# create the function that does the grouping and plotting
plot_lines <- function(df, x, y, group) {

x <- enquo(x)
group <- enquo(group)
group_bys <- quos(!! x, !! group)

df %>%
group_by(!!! group_bys) %>%
my_smry %>%
ggplot + geom_line(aes_(x = substitute(x), y = substitute(y),
group = substitute(group), color = substitute(group)))
}

# create a function to do the summarization
my_smry <- function(x) {
x %>%
summarize(conversion_rate = sum(converted) / sum(approved))
}

# use my function
my_df %>%
plot_lines(x = month, y = conversion_rate, group = category)

我觉得 group_by 处理很不雅:引用 xgroupenquo ,然后用 !! 取消引用它们在另一个引用函数内部 quos , 只是用 !!! 重新取消引用它们在下一行,但这是我唯一能够开始工作的事情。有一个更好的方法吗?

另外,有没有办法让ggplot采取 !!而不是 substitute ?我正在做的事情感觉不一致。

最佳答案

问题是 ggplot 尚未更新以处理 quosures,因此您必须将表达式传递给它,您可以使用 rlang::quo_expr 从 quosures 创建这些表达式。 :

library(tidyverse)
set.seed(47)

my_df <- data_frame(month = sample(1:12, 1000, replace = TRUE),
category = sample(head(letters, 3), 1000, replace = TRUE),
approved = as.numeric(runif(1000) < 0.5),
converted = approved * as.numeric(runif(1000) < 0.5))

plot_lines <- function(df, x, y, group) {
x <- enquo(x)
y <- enquo(y)
group <- enquo(group)

df %>%
group_by(!! x, !! group) %>%
summarise(conversion_rate = sum(converted) / sum(approved)) %>%
ggplot(aes_(x = rlang::quo_expr(x),
y = rlang::quo_expr(y),
color = rlang::quo_expr(group))) +
geom_line()
}

my_df %>% plot_lines(month, conversion_rate, category)



但是,请记住,ggplot 几乎不可避免地会从 lazyeval 更新为 rlang,因此虽然这个界面可能会继续工作,但很快就会有一个更简单、更一致的界面。

关于r - 使用 dplyr 进行函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47403477/

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