R data.table: gewichteter Prozentsatz der Untergruppe der Gruppe

Ich habe eindata.table mögen

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

Obwohl ich nicht sicher bin, ob dies das meiste istdata.table Weise kann ich Subgruppenhäufigkeit nach Gruppe mit @ berechntable undlength in einem einzigen Schritt - zum Beispiel, um die Frage zu beantworten: "Wie viel Prozent der roten Widgets sind rund?"

bearbeiten dieser Code liefert nicht die richtige Antwort

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

Aber ich kann diesen Ansatz nicht verwenden, um Fragen wie "Nach Gewicht, wie viel Prozent der roten Widgets sind rund?" Zu beantworten. Ich kann mir nur einen zweistufigen Ansatz einfallen lassen:

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

Ich suche nach einer einstufigen Herangehensweise an B und A, wenn sie verbesserungsfähig ist, in einer Erklärung, die mein Verständnis von @ vertiefdata.table -Syntax für gruppenweise Operationen. Bitte beachten Sie, dass sich diese Frage von @ unterscheideGewichtete Summe der Variablen nach Gruppen mit data.table weil meins Untergruppen beinhaltet und mehrere Schritte vermeidet. TYVM.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage