Я хочу свернуть следующий фрейм данных, используя как суммирование, так и средневзвешенные значения по группам.
У меня есть следующий фрейм данных
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)
И моя цель - одновременно свернуть мои данные, используя сумму eiter или средневзвешенное значение, в зависимости от типа переменной (то есть, если это в процентах, я использую средневзвешенное значение).
Вот моя лучшая попытка:
df_to_collapse %>% group_by(group_id) %>% summarise_at(.vars = c(to_be_summed_2,to_be_weighted_2), .funs=c(sum, mean))
Но, как видите, это не средневзвешенное
Я пробовал много разных способов использования 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
set.seed
перед созданием случайных данных примера, чтобы мы все смотрели на одно и то же и могли проверить возможные ответы. - person Frank   schedule 04.05.2018DT[, c(lapply(.SD[, ..to_be_weighted_2], weighted.mean, w = weighting), lapply(.SD[, ..to_be_summed_2], sum)), by=group_id]
- person Frank   schedule 04.05.2018