Ho un data.table
come:R data.table: sottogruppo per cento ponderato di gruppo
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))
Anche se io non sono sicuro che questo è il modo più data.table
, posso calcolare la frequenza dei sottogruppi per gruppo utilizzando table
e length
in un singolo passaggio, ad esempio, per rispondere alla domanda "Quale percentuale dei widget rossi è rotonda?"
edit: questo codice non prevede la risposta giusta
# 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
# ...
ma non posso usare questo approccio per rispondere a domande come "In peso, quale percentuale di widget rossi sono rotondi?" Posso venire solo con un approccio in due fasi:
# 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
# ...
sto cercando un approccio unico passaggio a B, e A se migliorabile, in una spiegazione che approfondisce la mia comprensione di data.table
sintassi per sottoprodotti di origine operazioni di gruppo. Si noti che questa domanda è diversa da Weighted sum of variables by groups with data.table perché la mia implica sottogruppi ed evita più passaggi. TYVM.
Guardando risposta da @Frank seguito ho notato che il mio tentativo A è non solo imbarazzante ma non corretto - per esempio, ho controllato 'widget [, sum (style == "round" & color == "red")/sum (color == "red")] # 0.36' – C8H10N4O2