Рассчитать ряд взвешенных средних в R для групп с разными весами

У меня есть следующий набор данных (простая версия моих фактических данных), "data", и я хотел бы рассчитать средневзвешенные значения для переменных x1 и x2, используя веса w1 и w2 соответственно, разделенные на две группы (группы, определяемые переменной n).

data <- data.frame(n = c(1,1,1,2,2,2), x1 = c(4,5,4,7,5,5), x2 = c(7,10,9,NaN,11,12), w1 = c(0,1,1,1,1,1), w2 = c(1,1,1,0,0,1))

Я пытаюсь сделать это с помощью with(), но я получаю сообщение об ошибке:

with(data, aggregate(x = list(x1=x1, x2=x2), by = list(n = n), FUN = weighted.mean, w = list(w1 = w1,w2 = w2)))

С другой стороны, если весовые коэффициенты не указаны, это работает, но в этом случае используются весовые коэффициенты по умолчанию (т. Е. Аналогично использованию FUN=mean).

with(data, aggregate(x = list(x1=x1, x2=x2), by = list(n = n), FUN = weighted.mean))

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

2 ответа

Пытаться

library(data.table)
setDT(data)[, .(x1=weighted.mean(x1, w1), x2=weighted.mean(x2, w2)) , by = n]

Или, как прокомментировал @thelatemail, мы можем использовать Map перебрать "x", соответствующие столбцы "w" и вызвать один weighted.mean

setDT(data)[, Map(weighted.mean, list(x1,x2), list(w1,w2)), by = n]

Если есть много столбцов "х" и "w", мы можем использовать grep чтобы получить имена столбцов, mget чтобы вернуть значения внутри Map

setDT(data)[,  Map(weighted.mean, mget(grep('x', names(data), 
    value=TRUE)), mget(grep('w', names(data), value=TRUE))), by = n]

Пытаться:

library(dplyr)
data %>% 
  group_by(n) %>% 
  summarise(x1 = weighted.mean(x1, w1), x2 = weighted.mean(x2, w2))
Другие вопросы по тегам