This is an extension of the question here.
I have a dataframe like so:
df<-structure(list(person = c("p1", "p1", "p1", "p1", "p1", "p1",
"p1", "p2", "p2", "p2", "p3", "p3", "p3", "p4", "p4", "p4", "p5",
"p5", "p5", "p6", "p6", "p6", "p7", "p7", "p7"), hp_char = c("hp1",
"hp2", "hp3", "hp4", "hp5", "hp6", "hp7", "hp8", "hp9", "hp10",
"hp1", "hp2", "hp3", "hp5", "hp6", "hp7", "hp8", "hp9", "hp10",
"hp3", "hp4", "hp5", "hp1", "hp2", "hp3")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -25L), .Names = c("person",
"hp_char"), spec = structure(list(cols = structure(list(person = structure(list(), class = c("collector_character",
"collector")), hp_char = structure(list(), class = c("collector_character",
"collector"))), .Names = c("person", "hp_char")), default = structure(list(), class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
Following the really efficient self-join/data.table answer provided by Uwe I get the number of instances of co-ocurrence of any TWO "hp_id" as follows:
df_by2<- setDT(df)[df, on = "person", allow = TRUE][
hp_char < i.hp_char, .N, by = .(HP_ID1 = hp_char, HP_ID2 = i.hp_char)]
This gives me:
HP_ID1 HP_ID2 N
1: hp1 hp2 3
2: hp1 hp3 3
3: hp2 hp3 3
4: hp1 hp4 1
5: hp2 hp4 1
6: hp3 hp4 2
7: hp1 hp5 1
8: hp2 hp5 1
9: hp3 hp5 2
10: hp4 hp5 2
11: hp1 hp6 1
12: hp2 hp6 1
13: hp3 hp6 1
14: hp4 hp6 1
15: hp5 hp6 2
16: hp1 hp7 1
17: hp2 hp7 1
18: hp3 hp7 1
19: hp4 hp7 1
20: hp5 hp7 2
21: hp6 hp7 2
22: hp10 hp8 2
23: hp8 hp9 2
24: hp10 hp9 2
However I was wondering if an extension of this method could be made where the number of instance of co-ocurrence of greater than two "hp_char" could be calculated. In other words I was looking for an output (e.g. for number of times 3 events occurring) in like so:
HP_ID1 HP_ID2 HP_ID3 N
1 hp1 hp2 hp3 3
2 hp3 hp4 hp5 2
3 hp5 hp6 hp7 2
4 hp8 hp9 hp10 2
So far I have been able to find multiple solutions for cooccurrence of two events but they do not seem to be generalizable to counting instances of >2 events. Thanks for any help!