lapply函数,带有dataframe和variable的参数

时间:2017-08-14 11:46:53

标签: r lapply tidyverse rlang tidyeval

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

2 个答案:

答案 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")