1

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

4

2 回答 2

2

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

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

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

于 2017-08-14T12:25:13.977 回答
1

你在错误的水平上工作。如果您将函数映射到数据框,则该函数应采用column。这里的问题是该函数my_fun()需要一个数据框而不是列。

你需要找到解决问题的其他方法。一种解决方案是使用 dplyr 提供的映射器:

dat %>%
  summarise_all(sum, na.rm = TRUE) %>%
  rename_all(paste0, "_new_name")

您可以等效地使用purrrmap()和from 的组合。set_names()

dat %>%
  map_df(sum, na.rm = TRUE) %>%
  set_names(paste0, "_new_name")
于 2017-08-14T17:12:55.697 回答