【发布时间】:2018-01-22 06:01:20
【问题描述】:
我有一个汇总变量的自定义函数。 我简化了函数来说明我的问题,即它比下面显示的更复杂。请注意,函数的一般结构应该保持不变:它需要一个参数来指定要处理哪个数据帧 (df),以及一个要汇总哪个变量的参数 (variable_to_test)。
my_fun <- function(df, variable_to_test) {
variable_to_test <- enquo(variable_to_test)
new_var_name <- paste0(quo_name(variable_to_test), "_new_name")
df %>%
summarise(
!!new_var_name := sum(!!variable_to_test, na.rm = TRUE)
)
}
使用示例,我可以将函数应用于数据框中的每个变量:
library(tidyverse)
dat <- tibble(
variable_1 = c(1:5, NA, NA, NA, NA, NA),
variable_2 = c(NA, NA, NA, NA, NA, 11:15)
)
> my_fun(dat, variable_1)
# A tibble: 1 x 1
variable_1_new_name
<int>
1 15
> my_fun(dat, variable_2)
# A tibble: 1 x 1
variable_2_new_name
<int>
1 65
但是:如何在数据框中的所有列上列出应用函数?我试过了
> dat %>%
+ lapply(., my_fun)
Error in duplicate(quo) : argument "quo" is missing, with no default
Called from: duplicate(quo)
但这会返回错误。我正在努力解决这样一个事实,即该函数需要一个参数来处理数据框和要汇总的变量。请注意,我想保留这个结构——我发现将数据帧的名称传递给函数而不是仅仅给函数提供变量名并将数据帧“硬编码”到函数体中更优雅。有人知道如何lapply() 函数吗?
【问题讨论】:
-
您是否需要
dplyr解决方案,或者base R 是否适合您的需求?通常你会通过给函数一个静态和一个变量输入来解决这个问题,例如lapply(dat, function(x) myfun(dat, x))。我不精通dplyr,但也许可以试试lapply(., function(x) myfun(., x))? -
我已经有了一个基本的 R 解决方案。我尝试用
tidyeval-方式重写函数,因为它增强了函数体的可读性。所以是的,我需要一个tidyeval-solution :)
标签: r lapply tidyverse rlang tidyeval