我有一个自定义函数,它总结了一个变量。 我简化了功能以说明我的问题,即它比下面显示的更复杂。请注意,函数的一般结构应保持不变:它需要一个参数来指定要处理的数据帧(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)
但这会返回错误。我正在努力解决这个问题:该函数为数据帧的工作和变量进行了总结。请注意,我希望保留这种结构 - 我发现将数据框的名称传递给函数更为优雅,而不是仅仅为函数提供变量名称和&#34;硬编码&#34;数据框进入函数体。有没有人知道如何lapply()
函数?
答案 0 :(得分:2)
哦,我认为你只是映射错误的东西。对于tidyverse解决方案,我会尝试:
map(dat, ~my_fun(dat, .))
这样做是映射列名称并将列插入.
。
答案 1 :(得分:1)
你在错误的水平上工作。如果在数据框上映射函数,则此函数应采用列。这里的问题是函数my_fun()
需要数据框而不是列。
您需要找到解决问题的其他方法。一种解决方案是使用dplyr提供的映射器:
dat %>%
summarise_all(sum, na.rm = TRUE) %>%
rename_all(paste0, "_new_name")
您可以等效地使用purrr中map()
和set_names()
的组合。
dat %>%
map_df(sum, na.rm = TRUE) %>%
set_names(paste0, "_new_name")