R data.table: взвешенный процент подгруппы группы

у меня естьdata.table лайк:

library(data.table)
widgets <- data.table(serial_no=1:100, 
                      color=rep_len(c("red","green","blue","black"),length.out=100),
                      style=rep_len(c("round","pointy","flat"),length.out=100),
                      weight=rep_len(1:5,length.out=100) )

Хотя я не уверен, что это самыйdata.table Кстати, я могу рассчитать частоту подгруппы по группам, используяtable а такжеlength за один шаг - например, чтобы ответить на вопрос "Какой процент красных виджетов круглый?"

редактировать: этот код не дает правильного ответа

# example A
widgets[, list(style = unique(style), 
               style_pct_of_color_by_count = 
                 as.numeric(table(style)/length(style)) ), by=color]

#    color  style style_pct_of_color_by_count
# 1:   red  round                        0.32
# 2:   red pointy                        0.32
# 3:   red   flat                        0.36
# 4: green pointy                        0.32
# ...

Но я не могу использовать этот подход для ответа на такие вопросы, как «По весу, какой процент красных виджетов круглые?» Я могу только придумать двухэтапный подход:

# example B
widgets[,list(cs_weight=sum(weight)),by=list(color,style)][,list(style, style_pct_of_color_by_weight=cs_weight/sum(cs_weight)),by=color]

#    color  style style_pct_of_color_by_weight
# 1:   red  round                    0.3466667
# 2:   red pointy                    0.3466667
# 3:   red   flat                    0.3066667
# 4: green pointy                    0.3333333
# ...

Я ищу одношаговый подход к B, и A, если это невозможно, в объяснении, которое углубляет мое пониманиеdata.table синтаксис для операций по группам. Обратите внимание, что этот вопрос отличается отВзвешенная сумма переменных по группам с data.table потому что моя включает в себя подгруппы и избегая нескольких шагов. TYVM.

Ответы на вопрос(3)

Ваш ответ на вопрос