Создание функции над списком с помощью tidyverse и sapply - PullRequest
3 голосов
/ 05 мая 2020

Я пытаюсь создать функцию для получения взвешенного среднего значения для одной и той же переменной в разных фреймах данных в списке. Функция не принимает некоторые аргументы (заработная плата и вес), я считаю, что есть проблемы с "" или [[]], но я не могу заставить ее работать.

Вот воспроизводимый пример, который дает мне ошибку

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))

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Есть несколько способов сделать это sh. Надеюсь, один из них направит вас в правильном направлении:

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

Создано 05.05.2020 с помощью пакета реплекс (v0.3.0)

0 голосов
/ 07 мая 2020

После того, как @ 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
...