How to find the longest duplicate sequence in a tibble column (follow up question)?

烈酒焚心 提交于 2019-12-24 22:32:09

问题


This is a follow up question to the one I posted here: How to find the longest duplicate sequence in a tibble column?

As the output, I need one more column (years):

library(tibble)
library(purrr)

my_tbl <- tribble(
  ~year, ~event_id, ~winner_id,
   2011,      "A",     4322,
   2012,      "A",     4322,
   2013,      "A",     4322,
   2014,      "A",     5478,
   2015,      "A",     4322,
   2011,      "B",     4322,
   2012,      "B",     7893,
   2013,      "B",     7893,
   2014,      "B",     2365,
   2015,      "B",     3407,
   2011,      "C",     5556,
   2012,      "C",     5556,
   2013,      "C",     1238,
   2014,      "C",     2391,
   2015,      "C",     2391,
   2011,      "D",     4219,
   2012,      "D",     7623,
   2013,      "D",     8003,
   2014,      "D",     2851,
   2015,      "D",     0418
)

 results_summary_tbl <- tribble(
    ~event_id, ~most_wins_in_a_row, ~number_of_winners, ~winners,                              ~years,
    "A",       3,                  1,                   "4322",                               "4322 = (2011, 2012, 2013)",
    "C",       2,                  2,                   "5556 , 2391",                        "5556 = (2011, 2012), 2391 = (2014, 2015)",
    "B",       2,                  1,                   "7893",                               "7893 = (2012, 2013)",
    "D",       1,                  5,                   "4219 , 7623 , 8003 , 2851 , 0418",   "4219 = (2011), 7623 = (2012), 8003 = (2013), 2851 = (2014), 0418 = (2015)"
 )

Thanks,


回答1:


Using data.table you can see which rows have the highest rowid(rleid(winner_id)), i.e. the highest number of consecutive duplicates, and use that to create an intermediate table. From there the computations are easier.

library(data.table)
setDT(my_tbl)

my_tbl[, ro := rowid(rleid(winner_id, event_id))]
most_wins <- my_tbl[my_tbl[, .(ro = max(ro)), event_id], on = .(ro, event_id)]
most_wins[, year := Map(function(x, y) toString(x - y:1 + 1), year, ro)]

most_wins[, .(most_wins_in_a_row = ro[1],
              number_of_winners = .N,
              winners = toString(winner_id),
              years = toString(paste0(winner_id, ' = (', year, ')')))
          , by = event_id]

#    event_id most_wins_in_a_row number_of_winners                     winners
# 1:        A                  3                 1                        4322
# 2:        B                  2                 1                        7893
# 3:        C                  2                 2                  5556, 2391
# 4:        D                  1                 5 4219, 7623, 8003, 2851, 418
#                                                                       years
# 1:                                                4322 = (2011, 2012, 2013)
# 2:                                                      7893 = (2012, 2013)
# 3:                                 5556 = (2011, 2012), 2391 = (2014, 2015)
# 4: 4219 = (2011), 7623 = (2012), 8003 = (2013), 2851 = (2014), 418 = (2015)



回答2:


Continuing from @tmfmnk's approach from the last post, we can achieve the expected output by

library(dplyr)

my_tbl %>%
   add_count(event_id, rleid = cumsum(winner_id != lag(winner_id, default = first(winner_id)))) %>%
   group_by(event_id) %>%
   mutate(most_wins_in_a_row = max(n),
          number_of_winners = n_distinct(winner_id[n == max(n)]),
          winners = paste0(unique(winner_id[n == max(n)]), collapse = ",")) %>%
    group_by(event_id, winner_id) %>%
    mutate(year = paste0(first(winner_id), "= (", toString(year), ")")) %>%
    group_by(event_id) %>%
    mutate(year = toString(unique(year))) %>%
    slice(1L)

If you add pull(year) to the above chain you'll see the output as

#[1] "4322= (2011, 2012, 2013, 2015), 5478= (2014)"                       
#[2] "4322= (2011), 7893= (2012, 2013), 2365= (2014), 3407= (2015)"       
#[3] "5556= (2011, 2012), 1238= (2013), 2391= (2014, 2015)"               
#[4] "4219= (2011), 7623= (2012), 8003= (2013), 2851= (2014), 418= (2015)"


来源:https://stackoverflow.com/questions/58799951/how-to-find-the-longest-duplicate-sequence-in-a-tibble-column-follow-up-questio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!