R data.table: porcentaje ponderado de subgrupo del grupo

tengo undata.table me gusta:

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) )

Aunque no estoy seguro de que esto sea lo másdata.table manera, puedo calcular la frecuencia de subgrupos por grupo usandotable ylength en un solo paso, por ejemplo, para responder la pregunta "¿Qué porcentaje de widgets rojos son redondos?"

editar: este código no proporciona la respuesta correcta

# 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
# ...

Pero no puedo usar ese enfoque para responder preguntas como "Por peso, ¿qué porcentaje de widgets rojos son redondos?" Solo puedo proponer un enfoque de dos pasos:

# 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
# ...

Estoy buscando un enfoque de un solo paso para B, y A si es mejorable, en una explicación que profundice mi comprensión dedata.table sintaxis para operaciones por grupo. Tenga en cuenta que esta pregunta es diferente deSuma ponderada de variables por grupos con data.table porque el mío involucra subgrupos y evita múltiples pasos. TYVM.

Respuestas a la pregunta(3)

Su respuesta a la pregunta