【问题标题】:Making a function over a list with tidyverse and sapply使用 tidyverse 和 sapply 在列表上创建函数
【发布时间】:2020-08-20 02:34:51
【问题描述】:

我正在尝试构建一个函数来获得列表中不同数据帧中同一变量的加权平均值。该函数没有接受一些参数(工资和体重),我相信存在“”或 [[]] 问题,但我似乎无法使其工作。

这是给出错误的可重现示例

set.seed(555)
lista <- list(A = data.frame(wage = (runif(10, min=50, max=100)), weight = (runif(10, min=0, max=1))),
B = data.frame(wage = (runif(10, min=55, max=105)), weight = (runif(10, min=0.1, max=1))))
list


wmeanf <- function(df, x, w) {
  mean <- df %>% summarise (weighted.mean(x,w))
  mean
}


twmean <- sapply(lista, function (X) wmeanf (df = X, x = wage, w = weight))

谢谢!

【问题讨论】:

    标签: r function tidyverse weighted-average


    【解决方案1】:

    有几种方法可以做到这一点。希望其中之一能让您朝着正确的方向前进:

    library(tidyverse)
    
    set.seed(555)
    lista <- list(A = data.frame(wage = (runif(10, min=50, max=100)), weight = (runif(10, min=0, max=1))),
                  B = data.frame(wage = (runif(10, min=55, max=105)), weight = (runif(10, min=0.1, max=1))))
    
    map(lista, ~ weighted.mean(x = .$wage, w = .$weight))
    #> $A
    #> [1] 75.60411
    #> 
    #> $B
    #> [1] 70.22652
    lapply(lista, function(x) { weighted.mean(x = x$wage, w = x$weight) })
    #> $A
    #> [1] 75.60411
    #> 
    #> $B
    #> [1] 70.22652
    sapply(lista, function(x) { weighted.mean(x = x$wage, w = x$weight) })
    #>        A        B 
    #> 75.60411 70.22652
    

    reprex package (v0.3.0) 于 2020 年 5 月 5 日创建

    【讨论】:

    • 感谢 Jason,在这种情况下,我的函数可以直接省略,并直接在列表上运行加权平均值 :) 但是如果我想使用它,或者更复杂的,什么是正确的制作/调用它的语法?
    • @JuanC 如果函数编写正确,语法应该或多或少相同。使用dplyr 进行编程有点复杂,因为它使用了非标准评估see this vignette。无论如何,如果您想做更多与自定义函数相关的事情并遇到困难,只需在此处使用搜索和/或发布另一个可重现的示例。
    • 谢谢,这是一个有用的小插曲,会检查的!
    【解决方案2】:

    在@Jason 建议查看here 关于 Dplyr 评估和引用后,我找到了一种方法来使我原来的预期功能工作:

    set.seed(555)
    lista <- list(A = data.frame(wage = (runif(10, min=50, max=100)), weight = (runif(10, min=0, max=1))),
                  B = data.frame(wage = (runif(10, min=55, max=105)), weight = (runif(10, min=0.1, max=1))))
    
    wmeanf <- function(df, x, w) {
    
      x <- enquo(x)
      w <- enquo(w)
    
      mean <- df %>% summarise (weighted.mean(!!x,!!w))
      mean
    }
    
    sapply(lista, function (X) wmeanf (df = X, x = wage, w = weight))
    
    $`A.weighted.mean(wage, weight)`
    [1] 75.6041053069
    
    $`B.weighted.mean(wage, weight)`
    [1] 70.2265239366
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 2018-05-24
      相关资源
      最近更新 更多