У меня есть data.table
как:R 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
# ...
Я ищу одностадийный подход к В, и А если улучшаемые, в объяснении, что углубляет свое понимание о data.table
синтаксисе для каждого конкретного групповые операции. Обратите внимание, что этот вопрос отличается от Weighted sum of variables by groups with data.table, поскольку мой раздел включает подгруппы и избегает нескольких шагов. TYVM.
Глядя на ответ от @Frank ниже я заметил, что моя попытка А не только неудобно, но неправильно - например, я проверил 'виджетов [, сумма (style == "round" & color == "red")/sum (color == "red")] # 0.36' – C8H10N4O2