如何在tibble列中找到最长的重复序列(后续问题)? [英] How to find the longest duplicate sequence in a tibble column (follow up question)?

查看:94
本文介绍了如何在tibble列中找到最长的重复序列(后续问题)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我在此处发布的问题的后续问题:

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)"
 )

谢谢

推荐答案

使用data.table,您可以看到哪些行具有最高的rowid(rleid(winner_id)),即连续重复项的数量最高,并使用该行创建中间表.从那里开始,计算变得更加容易.

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)

这篇关于如何在tibble列中找到最长的重复序列(后续问题)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆