Средневзвешенное значение с использованием агрегированного - PullRequest
1 голос
/ 09 июля 2020

Извините за вопрос, который может быть очень простым c вопросом, но я застрял в загадке и не могу выйти из нее.

У меня есть код, который выглядит как

Medicine  Biology  Business sex weights
0           1          0     1     0.5
0           0          1     0     1
1           0          0     1     05
0           1          0     0     0.33
0           0          1     0     0.33
1           0          0     1     1 
0           1          0     0     0.33
0           0          1     1     1
1           0          0     1     1

Где первые три - это области обучения, а четвертая переменная касается пола. Очевидно, со многими другими наблюдениями. Я хочу получить средний уровень области исследования (медицина, биология, бизнес) по разному полу (то есть среднее значение для мужчин и среднее значение для женщин). Для этого я использовал следующий код:

barplot_sex<-aggregate(x=df_dummies[,1:19] , by=list(df$sex),
                            FUN= function(x) mean(x)

, который отлично работает и дает мне то, что мне нужно. Моя проблема в том, что сейчас мне нужно использовать взвешенное среднее, но я не могу использовать

FUN= function(x) weighted.mean(x, weights)

, так как наблюдений гораздо больше, чем областей исследования.

Единственная альтернатива, которую мне удалось сделать было редактировать (диаграмма) и изменять значения вручную, но тогда R не сохраняет изменения. К тому же, я уверен, что должен быть простой способ сделать именно то, что мне нужно.

Любая помощь будет принята с благодарностью.

Лучше всего, Габриэль

1 Ответ

0 голосов
/ 09 июля 2020

Использование by.

by(dat, dat$sex, function(x) sapply(x[, 1:3], weighted.mean, x[, "weights"]))
# dat$sex: 0
# Medicine   Biology  Business 
# 0.0000000 0.3316583 0.6683417 
# --------------------------------------------------------------------------------------- 
# dat$sex: 1
# Medicine    Biology   Business 
# 0.82352941 0.05882353 0.11764706 

Данные:

dat <- structure(list(Medicine = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L
), Biology = c(1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L), Business = c(0L, 
1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L), sex = c(1L, 0L, 1L, 0L, 0L, 
1L, 0L, 1L, 1L), weights = c(0.5, 1, 5, 0.33, 0.33, 1, 0.33, 
1, 1)), class = "data.frame", row.names = c(NA, -9L))
...