【问题标题】:lapply function with arguments for dataframe and variable带有数据框和变量参数的 lapply 函数
【发布时间】: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


【解决方案1】:

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

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

它的作用是映射列名并将列插入到.

【讨论】:

    【解决方案2】:

    您的工作水平错误。如果你将一个函数映射到一个数据框,那么这个函数应该有一个。这里的问题是函数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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2019-11-22
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多