lapply 带有数据帧和变量参数的函数

lapply function with arguments for dataframe and variable

我有一个汇总变量的自定义函数。 我简化了函数来说明我的问题,即它比下面显示的更复杂。请注意,该函数的一般结构应保持不变:它需要一个参数来指定要处理的数据帧 (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)

但这returns是一个错误。我正在为这个函数接受一个参数来处理要处理的数据框和要汇总的变量这一事实而苦苦挣扎。请注意,我想保留此结构 - 我发现将数据框的名称传递给函数更优雅,而不是只为函数提供变量名和 "hard-code" 将数据框传递给函数体。有人知道如何 lapply() 这个函数吗?

哦,我认为你只是在映射错误的东西。对于 tidyverse 解决方案,我会尝试:

map(dat, ~my_fun(dat, .))

这样做是映射列名并将列插入 .

你的工作水平不对。如果将函数映射到数据框上,则此函数应采用 。这里的问题是函数 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")