У меня есть несколько фреймов данных, которые выглядят так (сокращенно):
ref       perc_fragments rank_code scientific_name 
Sample1   73.43          S         Escherichia coli                  
Sample1   2.10           S1        Escherichia coli P12b             
Sample1   1.40           S2        Escherichia coli CFT073           
Sample1   0.70           S1        Escherichia coli O6:H16
Sample1   1.40           S         Klebsiella pneumoniae     
Sample1   0.70           S         Shigella dysenteriae      
Sample1   1.40           S         Staphylococcus aureus     
Sample1   1.40           S1        S. aureus xyz
Что я хочу сделать, так это суммировать perc_fragments для всех строк в одной группе.  Первый S в столбце rank_code начинает группу, и все S1 или S2 после этого являются частью этой группы, пока не встретится новый S.  В приведенном выше случае первые четыре строки представляют собой одну группу, затем идут три строки с однорядными группами, а последние две строки представляют собой одну группу.  Я хочу, чтобы в столбце научное_имя отображалось научное_имя строки S для каждой группы с суммой S и всех S1 в одной группе.  Другими словами, это:
ref       perc_fragments rank_code scientific_name 
Sample1   77.63          S         Escherichia coli                  
Sample1   1.40           S         Klebsiella pneumoniae     
Sample1   0.70           S         Shigella dysenteriae      
Sample1   2.8            S         Staphylococcus aureus
Я пробовал несколько вещей, но простой grepl не сработает, чтобы сгруппировать их вместе, так как scientific_name может немного отличаться для S1 строк.
Тестовые данные:
structure(list(ref = c("Sample1", "Sample1", "Sample1", "Sample1", 
"Sample1", "Sample1", "Sample1", "Sample1", "Sample1", "Sample1", 
"Sample1", "Sample1", "Sample1", "Sample1", "Sample1", "Sample1", 
"Sample1", "Sample1", "Sample1", "Sample1", "Sample1"), perc_fragments = c("73.43", 
"2.10", "1.40", "0.70", "1.40", "0.70", "0.70", "0.70", "0.70", 
"0.70", "0.70", "0.70", "0.70", "0.70", "0.70", "1.40", "0.70", 
"0.70", "0.70", "1.40", "1.40"), rank_code = c("S", "S1", "S1", 
"S2", "S1", "S1", "S1", "S1", "S1", "S2", "S1", "S1", "S1", "S1", 
"S1", "S", "S", "S", "S", "S", "S1"), scientific_name = c("Escherichia coli", 
"Escherichia coli P12b", "Escherichia coli O157:H7", "Escherichia coli O157:H7 str. SS17", 
"Escherichia coli CFT073", "Escherichia coli O6:H16", "Escherichia coli APEC IMT5155", 
"Escherichia coli UM146", "Escherichia coli C", "Escherichia coli ATCC 8739", 
"Escherichia coli FAP1", "Escherichia coli O27:H7", "Escherichia coli IAI1", 
"Escherichia coli O127:H6", "Escherichia coli PCN061", "Klebsiella pneumoniae", 
"Klebsiella variicola", "Citrobacter freundii", "Shigella dysenteriae", 
"Staphylococcus aureus", "Staphylococci haemolyticus"
)), row.names = c(NA, -21L), class = c("tbl_df", "tbl", "data.frame"
))
 
                                                                     
                                                                     
                                                                    
cumsum! 10.03.2021