Я хочу свернуть следующий фрейм данных с использованием суммирования и взвешенных средних по группам.
У меня есть следующий фрейм данных
group_id = c(1,1,1,2,2,3,3,3,3,3)
var_1 = sample.int(20, 10)
var_2 = sample.int(20, 10)
var_percent_1 =rnorm(10,.5,.4)
var_percent_2 =rnorm(10,.5,.4)
weighting =sample.int(50, 10)
df_to_collapse = data.frame(group_id,var_1,var_2,var_percent_1,var_percent_2,weighting)
Я хочу свернуть свои данные в соответствии с группами, обозначенными group_id
. Однако в моих данных у меня есть переменные в абсолютных уровнях (var_1
, var_2
) и в процентах (var_percent_1
, var_percent_2
).
Я создаю два списка для каждого типа переменных (мои реальные данные намного больше, что делает это необходимым). У меня также есть весовая переменная (weighting
).
to_be_weighted =df_to_collapse[, 4:5]
to_be_summed = df_to_collapse[,2:3]
to_be_weighted_2=colnames(to_be_weighted)
to_be_summed_2=colnames(to_be_summed)
И моя цель состоит в том, чтобы одновременно свернуть мои данные, используя итоговую сумму или средневзвешенное значение, в соответствии с типом переменной (то есть, если это в процентах, я использую средневзвешенное значение).
Вот моя лучшая попытка:
df_to_collapse %>% group_by(group_id) %>% summarise_at(.vars = c(to_be_summed_2,to_be_weighted_2), .funs=c(sum, mean))
Но, как вы можете видеть, это не a средневзвешенное значение
Я пробовал много разных способов использования функции weighted.mean
, но мне не повезло. Вот пример одной такой попытки:
df_to_collapse %>% group_by(group_id) %>% summarise_at(.vars = c(to_be_weighted_2,to_be_summed_2), .funs=c(weighted.mean(to_be_weighted_2, weighting), sum))
и соответствующая ошибка:
Error in weighted.mean.default(to_be_weighted_2, weighting) :
'x' and 'w' must have the same length