【问题标题】:Pass a function to a function map and dplyr将函数传递给函数映射和 dplyr
【发布时间】:2021-12-03 05:18:14
【问题描述】:

我已经做了我自己的功能:

n_hires <- function(data, year) {
  data %>%
    filter(year(DateofHire) == year) %>%
    nrow()
}

我想传递给我编写的另一个函数:

df_count <- function(data, f) {
  map_dbl(years, ~ .f(data = .data, year = .x)) %>%
    setNames(years) %>%
    as.data.frame() %>%
    setNames("n") %>%
    rownames_to_column("Year")
}

当我运行函数时:

df_count(data = df, .f = n_hires)

返回:

> df_count(data = df, .f = n_hires)
  Error in df_count(data = df, .f = n_hires) : 
  unused argument (.f = n_hires)

如何将函数传递给函数?

【问题讨论】:

  • df_count中没有years的输入
  • 你需要df_count &lt;- function(data, years, f) { map_dbl(years, ~ f(data = data, year = .x)) %&gt;% setNames(years) %&gt;% as.data.frame() %&gt;% setNames("n") %&gt;% rownames_to_column("Year") }
  • 天哪……你又说对了。我需要休息一下,谢谢……@akrun

标签: r dplyr purrr


【解决方案1】:

我认为你过于复杂了。创建n_hires 函数以过滤特定年份并计算行数,然后创建df_count 运行循环以计算每个year 的行数。而不是这个,您可以直接计算每年的行数。

library(dplyr)
library(lubridate)

data %>% count(year = year(DateofHire))

如果您只对特定年份感兴趣,您可以filter他们。

data %>% count(year = year(DateofHire)) %>% filter(year %in% years)

【讨论】:

    【解决方案2】:

    df_count 中提供的函数没有显示“年”的输入。如果我们添加,它可能会起作用(未经测试)。还有,f可以直接通过,没有.f

    df_count <- function(data, years, f) {
        map_dbl(years, ~ f(data = data, year = .x)) %>% 
                  setNames(years) %>%
                 as.data.frame() %>%   
                 setNames("n") %>%   
         rownames_to_column("Year")
     } 
    

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2018-01-08
      • 2015-03-14
      • 2020-01-05
      相关资源
      最近更新 更多