用tidyverse和sapply在列表上做一个函数。

问题描述 投票:3回答:1

我正试图建立一个函数来获取列表中不同数据帧中同一变量的加权平均值。这个函数不接受一些参数(工资和权重),我相信有一个""或[[]]的问题,但我似乎不能使它工作。

下面是给我提供错误的可重复的例子。

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个回答
2
投票

有几种方法可以完成这个任务。希望其中一个能让你走在正确的方向上。

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

创建于2020-05-05 重读包 (v0.3.0)


0
投票

在@Jason的建议下,看 此处 关于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
© www.soinside.com 2019 - 2024. All rights reserved.