Albert Pariente-Cohen
Albert Pariente-Cohen

Reputation: 113

How to summarize events prior to a specific event (that can happen multiple times) across multiple observations in r?

I'm trying to collect data on what events have happened prior to a specific event (i.e. bDragons)which can be recurring based on the full observation. These are just an excerpt of one observation where a dragon is taken more than once, and I want to be able to pull insights on each and every one over many observations. So in the data set below, I would want to know that only 1 outer turret was taken prior to the first dragon at Time == 12.891. The next is taken at 20.215, which 4 towers and a drake before it.

 ID  TeamObj   Time       Type      Lane    League Year Season bResult rResult gamelength Gold
1  1  bTowers  9.397 OUTER_TURRET TOP_LANE  CBLoL 2017 Summer       1       0         34   NA
2  1  bDragons 12.891   AIR_DRAGON     <NA>  CBLoL 2017 Summer       1       0         34   NA
3  1  bTowers 16.215 OUTER_TURRET BOT_LANE  CBLoL 2017 Summer       1       0         34   NA
4  1  bTowers 16.591 INNER_TURRET BOT_LANE  CBLoL 2017 Summer       1       0         34   NA
5  1  bTowers 19.830 OUTER_TURRET MID_LANE  CBLoL 2017 Summer       1       0         34   NA
6  1  bDragons 20.215 EARTH_DRAGON     <NA>  CBLoL 2017 Summer       1       0         34   NA
7  1  bBarons 22.512 BARON_NASHOR     <NA>  CBLoL 2017 Summer       1       0         34   NA
8  1  bTowers 23.962 INNER_TURRET MID_LANE  CBLoL 2017 Summer       1       0         34   NA
9  1  bTowers 24.707 INNER_TURRET TOP_LANE  CBLoL 2017 Summer       1       0         34   NA
10 1  bTowers 24.962  BASE_TURRET TOP_LANE  CBLoL 2017 Summer       1       0         34   NA

I'd want this for every TeamObj of that type but the issue comes up where I try to group_by address and filter by (Time <= which(Team == bDragons)and the wrong things get filtered out or I can't summarize based on that count(Type) or anything. I'm looking for help on recording some type of recurring function or a better way to record and summarize that. Looking to fit the observations into a linear model later on, but I can't get to that square one which causes the issue.

Am I thinking about my filter incorrectly? My summarize? tst3 %>% group_by(ID) %>% filter(Time <= which(Team == "bDragons")) %>% summarize(count(Type))

Something like:

ID dragonID dragonType Time Baron_Nashor  Base_Turret  Inner_Turret  Nexus_Turret Outer_Turret
1 1 AIR_DRAGON 12.891 N/A N/A N/A N/A  1
2 2 EARTH_DRAGON 20.215 N/A N/A 1 N/A  3

and so on, if that is clear. Want to be able to use each as an observation.

Upvotes: 0

Views: 91

Answers (1)

Melissa Key
Melissa Key

Reputation: 4551

How about the following

tst3 %>%
  group_by(ID) %>%
  # arrange(Time) %>% # uncomment if needed
  mutate(
    Type = factor(Type),
    dragonID = cumsum(dplyr::lag(TeamObj == 'bDragons', default = 1))) %>%
  group_by(ID, dragonID) %>%
  summarize(
    dragonType = last(Type),
    Time = last(Time),
    tmp =  list(as.data.frame(table(Type)))) %>%
  unnest() %>%
  spread(Type, Freq, fill = 0) %>%
  # select(-ends_with("DRAGON")) %>%
  group_by(ID) %>%
  mutate_at(vars(BARON_NASHOR:OUTER_TURRET), cumsum) %>%
  filter(str_detect( dragonType, "DRAGON"))

Upvotes: 1

Related Questions