【问题标题】:Apply a list of functions to a vector of values将函数列表应用于值向量
【发布时间】:2021-05-12 17:18:53
【问题描述】:

我有一个命名向量列表,其中每个向量名称对应于我要应用于向量的每个元素的函数。我可以使用以下代码完成此操作:

funs <- list(mean = c("mpg", "wt"), 
             var = c("qsec", "am"))

lapply(seq_along(funs), function(i){
  fun <- get(names(funs)[i])
  vars <- funs[[i]]
  
  res <- lapply(vars, function(x){
    fun(mtcars[[x]])
  })

})

有没有更好的方法来做同样的事情?理想的解决方案是,按重要性排序,速度更快、内存效率更高且更紧凑。提前致谢。

【问题讨论】:

  • 切换到data.table 将是提高速度的最佳选择。更多的上下文会有所帮助 - 这个输出真的是你想要的格式(嵌套列表)吗?您想以这种方式应用的函数是否可靠地聚合函数? funs 列表的格式是固定的,还是您对其他输入选项开放?
  • 所有优秀的问题。输出可以是任何格式,只要(a)清楚哪些函数应用于哪些变量,并且(b)它可以很容易地转换为数据框。我要应用的函数可能是聚合函数或成对比较函数。 funs 列表的格式目前是固定的,但我对其他输入选项持开放态度。快速和内存效率的标准是最重要的,我愿意接受任何和所有可以改进我在这两个领域中发布的代码的解决方案。

标签: r


【解决方案1】:

使用 {purrr} 你可以做到这一点:

funs <- list(mean = c("mpg", "wt"), 
             var = c("qsec", "am"))
library(purrr)

imap(funs, ~ map(mtcars[.x], match.fun(.y)))
#> $mean
#> $mean$mpg
#> [1] 20.09062
#> 
#> $mean$wt
#> [1] 3.21725
#> 
#> 
#> $var
#> $var$qsec
#> [1] 3.193166
#> 
#> $var$am
#> [1] 0.2489919

reprex package (v0.3.0) 于 2021-05-11 创建

或与基数 R 相同的结果:

Map(function(x,nm) lapply(mtcars[x], nm), funs, names(funs))

【讨论】:

  • 你不应该使用get,除非你明确定义模式,即get(.y, mode = 'function')否则如果全局环境中有一个对象名称对应于给定的任何函数,它会抛出错误.你应该考虑match.fun(.y)
  • 很好的建议。谢谢你。
【解决方案2】:

一个稍微不同的选项可能是:

imap(funs,
     ~ mtcars %>%
      summarise(across(all_of(.x), ~ exec(!!.y, .))))

$mean
       mpg      wt
1 20.09062 3.21725

$var
      qsec        am
1 3.193166 0.2489919

【讨论】:

    【解决方案3】:

    我们可以使用match.fun来应用函数

    imap(funs, ~  {f1 <- .y
             mtcars %>%
              summarise(across(all_of(.x), ~ match.fun(f1)(.)))})
    

    【讨论】:

      【解决方案4】:

      我们也可以使用map2函数代替imap

      library(purrr)
      
      map2(funs, names(funs), ~ map_dbl(mtcars[.x], match.fun(.y)))
      
      $mean
           mpg       wt 
      20.09062  3.21725 
      
      $var
           qsec        am 
      3.1931661 0.2489919 
      

      或者用mapply 代替基本R 中的Map 以获得更好的输出(未简化):

      mapply(function(x, nm) sapply(mtcars[x], nm), funs, names(funs))
      
          mean     var      
      mpg 20.09062 3.193166 
      wt  3.21725  0.2489919
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        相关资源
        最近更新 更多