Home > Mobile >  Counting the max number of consecutive runs in a column
Counting the max number of consecutive runs in a column

Time:04-13

I have a dataset containing Site, Year and Total

structure(list(Site = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("B1", 
"B10", "B100", "B101", "B102", "B103", "B104", "B105", "B106", 
"B107", "B108", "B109", "B11", "B110", "B111", "B112", "B113", 
"B114", "B115", "B116", "B117", "B118", "B119", "B12", "B120", 
"B121", "B122", "B123", "B124", "B125", "B126", "B127", "B128", 
"B129", "B13", "B130", "B131", "B132", "B133", "B134", "B135", 
"B136", "B137", "B138", "B139", "B14", "B140", "B141", "B142", 
"B142A", "B143", "B144", "B145", "B146", "B147", "B148", "B149", 
"B15", "B150", "B151", "B152", "B153", "B154", "B155", "B156", 
"B157", "B158", "B159", "B16", "B160", "B161", "B162", "B163", 
"B164", "B165", "B166", "B168", "B169", "B17", "B170", "B170A", 
"B171", "B172", "B173", "B174", "B175", "B176", "B177", "B178", 
"B179", "B18", "B180", "B181", "B182", "B183", "B184", "B185", 
"B186", "B187", "B188", "B189", "B19", "B190", "B191", "B192", 
"B193", "B194", "B194A", "B195", "B196", "B197", "B198", "B199", 
"B2", "B20", "B200", "B201", "B203", "B204", "B205", "B206", 
"B207", "B208", "B21", "B211", "B212", "B213", "B214", "B215", 
"B216", "B217", "B218", "B219", "B22", "B220", "B221", "B222", 
"B223", "B224", "B225", "B226", "B227", "B228", "B229", "B23", 
"B24", "B25", "B26", "B27", "B28", "B29", "B3", "B30", "B307", 
"B31", "B32", "B33", "B34", "B35", "B36", "B37", "B38", "B39", 
"B4", "B40", "B42", "B43", "B44", "B45", "B46", "B47", "B48", 
"B49", "B5", "B51", "B52", "B53", "B54", "B55", "B56", "B57", 
"B58", "B59", "B6", "B60", "B62", "B62A", "B63", "B64", "B65", 
"B66", "B67", "B68", "B69", "B7", "B70", "B71", "B72", "B74", 
"B75", "B76", "B77", "B78", "B79", "B79A", "B8", "B80", "B80A", 
"B81", "B84", "B85", "B86", "B87", "B88", "B89", "B9", "B90", 
"B91", "B92", "B93", "B94", "B95", "B96", "B97", "B98", "B99", 
"B99A", "C0", "C1", "C10", "C101", "C102", "C103", "C104", "C105", 
"C106", "C107", "C108", "C109", "C11", "C110", "C111", "C112", 
"C113", "C114", "C115", "C116", "C117", "C118", "C119", "C12", 
"C120", "C121", "C122", "C123", "C124", "C125", "C126", "C127", 
"C128", "C129", "C13", "C130", "C131", "C132", "C133", "C134", 
"C135", "C136", "C137", "C138", "C139", "C14", "C140", "C141", 
"C142", "C143", "C144", "C145", "C146", "C147", "C148", "C149", 
"C15", "C150", "C151", "C152", "C153", "C154", "C155", "C156", 
"C157", "C158", "C159", "C16", "C160", "C160A", "C160B", "C161", 
"C162", "C163", "C17", "C18", "C19", "C2", "C20", "C21", "C22", 
"C23", "C24", "C24A", "C24B", "C24C", "C25", "C26", "C27", "C28", 
"C29", "C3", "C30", "C31", "C32", "C33", "C34", "C34A", "C35", 
"C36", "C37", "C38", "C39", "C3A", "C3B", "C4", "C40", "C41", 
"C42", "C43", "C44", "C45", "C46", "C47", "C48", "C49", "C5", 
"C50", "C51", "C52", "C53", "C54", "C55", "C56", "C57", "C58", 
"C59", "C6", "C60", "C61", "C61A", "C62", "C63", "C7", "C8", 
"C9", "C9A", "CP0", "CP000", "CP1", "CP10", "CP100", "CP101", 
"CP102", "CP103", "CP104", "CP105", "CP107", "CP108", "CP109", 
"CP11", "CP110", "CP111", "CP112", "CP113", "CP114", "CP115", 
"CP116", "CP117", "CP118", "CP119", "CP12", "CP120", "CP121", 
"CP122", "CP123", "CP124", "CP125", "CP126", "CP127", "CP128", 
"CP129", "CP13", "CP130", "CP131", "CP132", "CP133", "CP134", 
"CP135", "CP136", "CP137", "CP138", "CP139", "CP14", "CP140", 
"CP141", "CP142", "CP143", "CP144", "CP145", "CP146", "CP147", 
"CP148", "CP149", "CP14A", "CP15", "CP150", "CP151", "CP152", 
"CP153", "CP154", "CP155", "CP156", "CP157", "CP158", "CP16", 
"CP17", "CP18", "CP188", "CP18A", "CP19", "CP191", "CP2", "CP20", 
"CP21", "CP215", "CP22", "CP23", "CP24", "CP25", "CP26", "CP27", 
"CP28", "CP29", "CP3", "CP30", "CP31", "CP32", "CP33", "CP34", 
"CP35", "CP36", "CP37", "CP38", "CP38A", "CP39", "CP4", "CP40", 
"CP40A", "CP41", "CP42", "CP42A", "CP43", "CP5", "CP54", "CP55", 
"CP5A", "CP5B", "CP6", "CP64", "CP65", "CP7", "CP72", "CP73", 
"CP8", "CP80", "CP82", "CP89", "CP9", "CP95", "CP97", "CP9A", 
"EX0", "EX041D", "EX059", "EX064", "EX1", "EX10", "EX100", "EX101", 
"EX102", "EX103", "EX104", "EX105", "EX106", "EX107", "EX108", 
"EX109", "EX10A", "EX11", "EX110", "EX111", "EX112", "EX113", 
"EX114", "EX115", "EX116", "EX117", "EX118", "EX119", "EX12", 
"EX120", "EX121", "EX122", "EX123", "EX124", "EX125", "EX126", 
"EX127", "EX12A", "EX13", "EX13A", "EX14", "EX14A", "EX14B", 
"EX15", "EX16", "EX17", "EX18", "EX18A", "EX19", "EX19A", "EX2", 
"EX20", "EX21", "EX22", "EX23", "EX24", "EX25", "EX25A", "EX26", 
"EX27", "EX28", "EX29", "EX29A", "EX3", "EX30", "EX31", "EX31A", 
"EX32", "EX32A", "EX33", "EX34", "EX34A", "EX35", "EX35A", "EX36", 
"EX37", "EX38", "EX38A", "EX39", "EX39A", "EX39B", "EX39C", "EX3A", 
"EX4", "EX40", "EX41", "EX41A", "EX41B", "EX41C", "EX41D", "EX41E", 
"EX42", "EX42A", "EX43", "EX43A", "EX43B", "EX43C", "EX43D", 
"EX43E", "EX44", "EX45", "EX46", "EX47", "EX47A", "EX48", "EX48A", 
"EX49", "EX49A", "EX49B", "EX49C", "EX5", "EX50", "EX51", "EX51A", 
"EX51B", "EX51C", "EX51D", "EX52", "EX53", "EX54", "EX55", "EX56", 
"EX57", "EX58", "EX59", "EX5A", "EX5B", "EX6", "EX60", "EX61", 
"EX62", "EX62A", "EX62B", "EX62C", "EX62D", "EX62E", "EX62F", 
"EX62G", "EX62H", "EX62I", "EX62X", "EX63", "EX64", "EX65", "EX65A", 
"EX66", "EX67", "EX68", "EX69", "EX69A", "EX7", "EX70", "EX71", 
"EX71A", "EX72", "EX72A", "EX73", "EX73A", "EX74", "EX75", "EX75A", 
"EX76", "EX77", "EX78", "EX79", "EX7A", "EX8", "EX80", "EX80A", 
"EX81A", "EX84", "EX85", "EX86", "EX87", "EX88", "EX89", "EX8A", 
"EX9", "EX90", "EX91", "EX92", "HE0", "HE1", "HE2", "HE3", "HE4", 
"HE5", "MP1", "MP10", "MP100", "MP11", "MP12", "MP13", "MP14", 
"MP15", "MP16", "MP17", "MP18", "MP19", "MP2", "MP20", "MP21", 
"MP22", "MP23", "MP24", "MP25", "MP26", "MP27", "MP28", "MP29", 
"MP3", "MP30", "MP31", "MP32", "MP33", "MP34", "MP34A", "MP35", 
"MP36", "MP37", "MP38", "MP39", "MP4", "MP40", "MP41", "MP42", 
"MP43", "MP44", "MP45", "MP46", "MP47", "MP48", "MP49", "MP5", 
"MP50", "MP51", "MP52", "MP53", "MP54", "MP55", "MP56", "MP57", 
"MP58", "MP59", "MP6", "MP60", "MP61", "MP62", "MP63", "MP64", 
"MP65", "MP66", "MP66A", "MP67", "MP68", "MP69", "MP7", "MP70", 
"MP71", "MP72", "MP73", "MP74", "MP75", "MP76", "MP77", "MP78", 
"MP79", "MP8", "MP80", "MP81", "MP82", "MP83", "MP84", "MP85", 
"MP86", "MP87", "MP88", "MP89", "MP9", "MP90", "MP91", "MP92", 
"MP93", "MP94", "MP95", "MP96", "MP97", "MP98", "O1", "O10", 
"O100", "O101", "O102", "O103", "O104", "O105", "O106", "O107", 
"O108", "O109", "O11", "O110", "O111", "O112", "O113", "O114", 
"O115", "O116", "O117", "O118", "O119", "O12", "O13", "O131", 
"O13A", "O14", "O15", "O16", "O17", "O18", "O19", "O2", "O20", 
"O201", "O202", "O203", "O204", "O205", "O206", "O207", "O208", 
"O209", "O21", "O210", "O211", "O212", "O213", "O214", "O215", 
"O216", "O217", "O218", "O219", "O22", "O220", "O221", "O222", 
"O223", "O224", "O225", "O226", "O227", "O228", "O229", "O23", 
"O230", "O231", "O232", "O234", "O235", "O236", "O237", "O238", 
"O239", "O24", "O240", "O241", "O242", "O243", "O244", "O245", 
"O246", "O248", "O249", "O25", "O250", "O251", "O252", "O253", 
"O254", "O255", "O256", "O257", "O258", "O259", "O26", "O260", 
"O261", "O27", "O27A", "O28", "O29", "O3", "O30", "O30A", "O31", 
"O31A", "O32", "O33", "O34", "O35", "O36", "O37", "O38", "O38A", 
"O38B", "O39", "O4", "O40", "O41", "O42", "O43", "O44", "O45", 
"O46", "O47", "O48", "O49", "O5", "O50", "O51", "O52", "O53", 
"O54", "O55", "O56", "O57", "O58", "O59", "O5A", "O6", "O60", 
"O61", "O62", "O63", "O64", "O65", "O66", "O67", "O68", "O69", 
"O7", "O70", "O71", "O72", "O73", "O73A", "O73B", "O74", "O75", 
"O75A", "O75B", "O75C", "O75D", "O76", "O77", "O78", "O78A", 
"O79", "O8", "O80", "O81", "O82", "O83", "O84", "O85", "O86", 
"O87", "O88", "O88A", "O89", "O9", "O90", "O92", "O93", "O94", 
"O95", "O96", "O97", "O999", "P1", "P10", "P100", "P101", "P102", 
"P103", "P104", "P105", "P106", "P107", "P108", "P109", "P11", 
"P110", "P111", "P112", "P113", "P115", "P116", "P117", "P118", 
"P119", "P12", "P120", "P121", "P122", "P123", "P124", "P125", 
"P126", "P13", "P14", "P15", "P16", "P17", "P18", "P19", "P2", 
"P20", "P21", "P22", "P23", "P24", "P3", "P4", "P5", "P6", "P7", 
"P8", "P9", "SM1", "SM2", "SM4", "SM5", "SM6", "SW1", "SW10", 
"SW101", "SW101A", "SW102", "SW103", "SW104", "SW104A", "SW104B", 
"SW105", "SW106", "SW107", "SW108", "SW109", "SW109A", "SW11", 
"SW110", "SW111", "SW112", "SW113", "SW114", "SW115", "SW116", 
"SW117", "SW118", "SW119", "SW12", "SW120", "SW121", "SW122", 
"SW123", "SW124", "SW125", "SW126", "SW127", "SW128", "SW129", 
"SW12A", "SW13", "SW130", "SW131", "SW132", "SW133", "SW134", 
"SW14", "SW15", "SW16", "SW17", "SW18", "SW19", "SW2", "SW20", 
"SW21", "SW22", "SW23", "SW24", "SW25", "SW26", "SW27", "SW28", 
"SW29", "SW3", "SW30", "SW31", "SW32", "SW33", "SW34", "SW35", 
"SW36", "SW37", "SW38", "SW39", "SW4", "SW40", "SW41", "SW42", 
"SW43", "SW44", "SW45", "SW46", "SW47", "SW48", "SW49", "SW49A", 
"SW5", "SW50", "SW51", "SW52", "SW53", "SW54", "SW55", "SW56", 
"SW57", "SW58", "SW59", "SW6", "SW60", "SW61", "SW61A", "SW62", 
"SW63", "SW64", "SW65", "SW66", "SW67", "SW68", "SW69", "SW7", 
"SW70", "SW71", "SW72", "SW73", "SW74", "SW75", "SW76", "SW77", 
"SW78", "SW79", "SW8", "SW80", "SW80A", "SW81", "SW82", "SW83", 
"SW84", "SW84A", "SW85", "SW86", "SW87", "SW88", "SW89", "SW9", 
"SW90", "SW93", "SW94", "SW96", "SW98", "SW99", "W1", "W10", 
"W100", "W101", "W102", "W103", "W103A", "W104", "W105", "W11", 
"W12", "W13", "W14", "W15", "W16", "W16A", "W17", "W17A", "W18", 
"W19", "W2", "W20", "W200", "W201", "W202", "W203", "W204", "W205", 
"W206", "W207", "W208", "W209", "W20A", "W21", "W210", "W211", 
"W22", "W22A", "W23", "W24", "W25", "W26", "W27", "W28", "W29", 
"W3", "W30", "W31", "W32", "W33", "W34", "W35", "W36", "W37", 
"W38", "W39", "W4", "W40", "W41", "W42", "W43", "W43A", "W44", 
"W45", "W46", "W47", "W48", "W49", "W4A", "W4B", "W5", "W50", 
"W51", "W51A", "W52", "W53", "W54", "W54N", "W55", "W56", "W57", 
"W58", "W59", "W6", "W60", "W61", "W62", "W63", "W64", "W64A", 
"W64B", "W65", "W66", "W67", "W68", "W69", "W7", "W70", "W71", 
"W72", "W73", "W74", "W75", "W75A", "W76", "W77", "W78", "W79", 
"W8", "W80", "W81", "W82", "W83", "W84", "W85", "W86", "W87", 
"W88", "W89", "W9", "W90", "W91", "W92", "W93", "W94", "W95", 
"W96", "W97", "W98", "W98A", "W99", "W99A", "X0", "X10", "X13", 
"X14", "X17", "X2", "X204", "X209", "X221", "X23", "X24", "X25", 
"X26", "X28", "X3", "X30", "X32", "X33", "X34", "X35", "X37", 
"X4", "X40", "X41", "X42", "X48", "X49", "X5", "X52", "X53", 
"X54", "X57", "X58", "X59", "X6", "X61", "X62", "X63", "X65", 
"X66", "X67", "X68", "X7", "X70", "X71", "X73", "X74", "X78", 
"X80", "X82", "X86", "X87", "X88", "X90", "X96", "XBN1", "XBN3", 
"XBN6", "XBY1", "XBY13", "XBY16", "XBY18", "XBY19", "XD1", "XD10", 
"XD11", "XD12", "XD13", "XD14", "XD15", "XD16", "XD18", "XD19", 
"XD2", "XD20", "XD21", "XD22", "XD23", "XD24", "XD25", "XD26", 
"XD3", "XD31", "XD35", "XD36", "XD37", "XD38", "XD4", "XD5", 
"XD6", "XD7", "XD8", "XD9", "XDE1", "XDE12", "XDE14", "XDE15", 
"XDE2", "XDE3", "XDE4", "XDE7", "XDE9", "XF1", "XF10", "XF11A", 
"XF11C", "XF17", "XF1B", "XF20", "XF20B", "XF21", "XF24", "XF25A", 
"XF25B", "XF25C", "XF25D", "XF26", "XF3", "XF4", "XFR10", "XFR13", 
"XFR23", "XFR7", "XG2", "XG3", "XG4", "XG6", "XG9", "XH1", "XH11", 
"XH2", "XH3", "XH4", "XH5", "XH6", "XH6B", "XH7A", "XH7B", "XH8", 
"XH9", "XHE20", "XHE28", "XHG11", "XHG5", "XHG8", "XHG9", "XJ1", 
"XJ15", "XJ17", "XJ22", "XJ28", "XJ3", "XJ33", "XJ38", "XJ39", 
"XJ4", "XJ40", "XJ41", "XJ42", "XJ8", "XM3", "XMX1", "XN1", "XN2", 
"XN3", "XN4", "XN5A", "XN5B", "XN5C", "XN5D", "XN7", "XN8", "XN9", 
"XS1A", "XS1B", "XS4", "XS7", "XSC1", "XSC10", "XSC11", "XSC14", 
"XSC2", "XSC3", "XSC5", "XSC6", "XSC8", "XSW5", "XSW9", "XT10", 
"XT11", "XT12", "XT13", "XT14", "XT3", "XT4", "XT5", "XT6", "XT7", 
"XT8", "XT9", "XTH3", "XTH8", "XW1", "XW14", "XW19B", "XW2", 
"XW20", "XW21", "XW22", "XW23", "XW23C", "XW5", "XWF3", "XWF5", 
"XWY16", "XWY19A", "XWY19B", "XWY25", "XWY3", "XWY4"), class = "factor"), 
    Year = c(1961L, 1983L, 1986L, 1987L, 1990L, 1996L, 2001L, 
    2002L, 2006L, 2012L, 1954L, 1973L, 1977L, 1979L, 1980L, 1981L, 
    1985L, 1988L, 1991L, 1993L, 2001L, 2002L, 2007L, 2008L, 2010L, 
    2013L, 2018L, 1960L, 1961L, 1980L, 1983L, 1986L, 1998L, 2000L, 
    2001L, 2004L, 2007L, 2010L, 1956L, 1981L, 1982L, 1994L, 2003L, 
    2011L, 1959L, 1961L, 1965L, 1987L, 1989L, 2002L), Total = c(8L, 
    5L, 7L, 6L, 11L, 7L, 7L, 14L, 8L, 10L, 9L, 9L, 6L, 10L, 7L, 
    8L, 10L, 2L, 3L, 7L, 5L, 13L, 6L, 7L, 7L, 4L, 9L, 7L, 8L, 
    7L, 6L, 4L, 6L, 6L, 14L, 7L, 8L, 9L, 9L, 9L, 7L, 10L, 4L, 
    6L, 4L, 4L, 6L, 11L, 7L, 6L)), row.names = 2:51, class = "data.frame")

I have been trying to count the max number of consecutive years that a site has been used. The Total column doesn't matter for now. I can isolate consecutive years and identify them using variations of

s <- split(df$Year, cumsum(c(TRUE, diff(df$Year) != 1)))

but this doesn't give me what I want which ideally would look something like

Site   Max Consecutive Years  Range
B10    10                     1947-1956
B107   2                      2000-2001
B122   8                      1988-1995

If anyone can point me in the right direction I would be very grateful

CodePudding user response:

Maybe this helps, there are certainly faster ways. The idea is to build an indicator whether there are consecutive rows and filter for more than one occurence per group (i.e. consecutive rows).

df %>%
  group_split(Site) %>%
  map_dfr(~ .x %>%
    mutate(consec_helper = cumsum(c(1, diff(Year) != 1))) %>%
    group_by(consec_helper) %>%
    filter(n() > 1) %>%
    mutate(
      count_consectuive_years = n(),
      period = stringr::str_c(first(Year), "-", last(Year))
    ) %>%
    ungroup()) %>%
  select(-consec_helper, -Year) %>%
  distinct(Site, period, .keep_all = T)

Result:

Site Total count_consectuive_years    period
   B1     7                       2 1986-1987
   B1     7                       2 2001-2002
  B10    10                       3 1979-1981
  B10     5                       2 2001-2002
  B10     6                       2 2007-2008
 B100     7                       2 1960-1961
 B100     6                       2 2000-2001
 B101     9                       2 1981-1982

CodePudding user response:

Another solution using dplyr

df2 <- df %>% group_by(Site) %>% mutate(a=cumsum(c(TRUE, diff(Year) != 1))) %>% #Using your variable
  group_by(Site,a) %>% summarise(Range = if_else(min(Year)!=max(Year),paste(min(Year),max(Year),sep="-"),as.character(min(Year)))
                                 , Max = sum(Total)) %>% #Calculating ranges and number of visits grouping by your variable
  group_by(Site) %>% slice(which.max(Max)) %>% select(-a) # Taking max, deleting a

CodePudding user response:

Another possible solution:

library(tidyverse)

df %>% 
  group_by(Site) %>% 
  mutate(aux = (Year == (lead(Year, default = 0) - 1)))  %>% 
  mutate(aux2 = data.table::rleid(aux)) %>% 
  ungroup() %>% 
  filter(aux) %>% 
  add_count(Site, aux2) %>% 
  mutate(n = n   1) %>% 
  group_by(Site, aux2, n) %>% 
  summarise(Range = str_c(min(Year), max(Year) 1, sep = "-"), .groups = "drop") %>% 
  select(-aux2)

#> # A tibble: 8 × 3
#>   Site      n Range    
#>   <fct> <dbl> <chr>    
#> 1 B1        2 1986-1987
#> 2 B1        2 2001-2002
#> 3 B10       3 1979-1981
#> 4 B10       2 2001-2002
#> 5 B10       2 2007-2008
#> 6 B100      2 1960-1961
#> 7 B100      2 2000-2001
#> 8 B101      2 1981-1982
  • Related