Агрегирование, если каждое наблюдение может принадлежать нескольким группам с несколькими группирующими переменными - PullRequest
0 голосов
/ 23 мая 2018

Этот вопрос является продолжением: Агрегирование, если каждое наблюдение может принадлежать нескольким группам .

Как и в связанном вопросе, мои наблюдения могут принадлежать нескольким группам.Но теперь у меня есть 2 группирующие переменные, что значительно усложняет задачу (по крайней мере, для меня).В приведенном ниже примере наблюдение может принадлежать одной или нескольким группам A, B, C. Но я также хочу провести различие в соответствии с другим фактором, т. Е. Является x <1, x <.5 или y <0. Так как все xменьшие 0 и меньшие 1 каждое наблюдение может снова принадлежать более чем одной группе.Я хочу объединить в соответствии с обеими группировками (A, B, C и x <1, x <.5, y <0) и получить в результате совокупность всех комбинаций ((A и x <1), (A и x<.5), ..., (C и x <0). Дайте мне знать, если вопрос недостаточно ясен, и не стесняйтесь редактировать заголовок, так как я не смог придумать правильный. </p>

# The data
library(data.table)
n <- 500
set.seed(1)
TF <- c(TRUE, FALSE)
time <- rep(1:4, each = n/4)


df <- data.table(time = time, x = rnorm(n), groupA = sample(TF, size = n, replace = TRUE),
                 groupB = sample(TF, size = n, replace = TRUE),
                 groupC = sample(TF, size = n, replace = TRUE))

df[ ,c("smaller1", "smaller.5", "smaller0") := .(x <= 1, x <= 0.5, x <= 0)]

# The result should look like this (a solution for wide format would be nice as well) but less repetitive
rbind(
df[smaller1 == TRUE , .(lapply(.SD*x, sum), c("A_smaller1", "B_smaller1", "C_smaller1")), by=.(time),.SDcols = c("groupA", "groupB", "groupC")],
df[smaller.5 == TRUE , .(lapply(.SD*x, sum), c("A_smaller.5", "B_smaller.5", "C_smaller.5")), by=.(time),.SDcols = c("groupA", "groupB", "groupC")],
df[smaller0 == TRUE , .(lapply(.SD*x, sum), c("A_smaller0", "B_smaller0", "C_smaller0")), by=.(time),.SDcols = c("groupA", "groupB", "groupC")]
)

1 Ответ

0 голосов
/ 24 мая 2018

Во-первых, вы можете плавить и подмножество групп с == TRUE.Затем используйте CJ (т.е. перекрестное соединение), чтобы создать список всех комбинаций.Затем выполните неравное объединение с исходным набором данных и сделайте сумму следующим образом:

mDT <- melt(df, id.vars=c("time", "x"))[(value)]
mDT[CJ(time=time, variable=variable, Level=seq(0,1,0.5), unique=TRUE), 
    sum(x.x), 
    by=.EACHI, 
    on=.(time, variable, x < Level)]
...