Сводка вопроса
Я хочу умножить вектор чисел (столбец Sum_By_Group
) на вектор процентов (столбец Percent
), чтобы распределить общее число для группы по каждому идентификатору, округлите результат и получите то же общее число, с которого я начал. Другими словами, я хочу, чтобы столбец Distribution_Post_Round
был таким же, как столбец Sum_By_Group
.
Ниже приведен пример проблемы, с которой я столкнулся. В группе A я умножаю Percent
на Sum_By_Group
и завершаю sh на 3 в ID 1, 3 в ID 2 и 1 в ID 5, в сумме получается 7. Столбец Sum_By_Group
и столбец Distribution_Post_Round
одинаковы для группы А, и это то, что я хочу. В группе B я умножаю Percent
на Sum_By_Group
и завершаю sh на 1 в ID 8 и 1 в ID 10, в сумме получается 2. Я хочу, чтобы в столбце Distribution_Post_Round
было 3 для группы B.
Есть ли способ сделать это без использования циклов, разделения фреймов данных на части и последующего объединения фреймов данных вместе?
Пример
library(dplyr)
df = data.frame('Group' = c(rep('A', 7), rep('B', 5)),
'ID' = c(1:12),
'Percent' = c(0.413797750, 0.385366840, 0.014417571, 0.060095668, 0.076399650,
0.019672573, 0.030249949, 0.381214519, 0.084121796, 0.438327886,
0.010665749, 0.085670050),
'Sum_By_Group' = c(rep(7,7), rep(3, 5)))
df$Distribute_By_ID = round(df$Percent * df$Sum_By_Group, 0)
df_round = aggregate(Distribute_By_ID ~ Group, data = df, sum)
names(df_round)[names(df_round) == 'Distribute_By_ID'] = 'Distribution_Post_Round'
df = left_join(df, df_round, by = 'Group')
df
Group ID Percent Sum_By_Group Distribute_By_ID Distribution_Post_Round
A 1 0.41379775 7 3 7
A 2 0.38536684 7 3 7
A 3 0.01441757 7 0 7
A 4 0.06009567 7 0 7
A 5 0.07639965 7 1 7
A 6 0.01967257 7 0 7
A 7 0.03024995 7 0 7
B 8 0.38121452 3 1 2
B 9 0.08412180 3 0 2
B 10 0.43832789 3 1 2
B 11 0.01066575 3 0 2
B 12 0.08567005 3 0 2
Большое спасибо за вашу помощь . Пожалуйста, дайте мне знать, если необходимы дополнительные разъяснения.