Home > Blockchain >  group_by and slice on groups based on condition
group_by and slice on groups based on condition

Time:04-18

I have a data frame which looks like:

             Municipios_Names                    Distritos_Names                                  Zonas_Names
1           Barcelona Capital                       Ciutat Vella                                 Ciutat Vella
2           Barcelona Capital                       Ciutat Vella                                  Barri Gòtic
3           Barcelona Capital                       Ciutat Vella                                     El Raval
4           Barcelona Capital                       Ciutat Vella                               La Barceloneta
5           Barcelona Capital                       Ciutat Vella         Sant Pere, Sta. Caterina i la Ribera
6           Barcelona Capital                           Eixample                                     Eixample
7           Barcelona Capital                           Eixample                          Dreta de l'Eixample
8           Barcelona Capital                           Eixample                                   Fort Pienc
9           Barcelona Capital                           Eixample               La Nova Esquerra de l'Eixample
10          Barcelona Capital                           Eixample              L'Antiga Esquerra de l'Eixample
11          Barcelona Capital                           Eixample                              Sagrada Família
12          Barcelona Capital                           Eixample                                  Sant Antoni
13          Barcelona Capital                             Gràcia                                       Gràcia
14          Barcelona Capital                             Gràcia           El Camp d'en Grassot i Gràcia Nova
15          Barcelona Capital                             Gràcia                                      El Coll
16          Barcelona Capital                             Gràcia                                     La Salut
17          Barcelona Capital                             Gràcia                    Vallcarca i els Penitents
18          Barcelona Capital                             Gràcia                               Vila de Gràcia
19          Barcelona Capital                   Horta - Guinardó                             Horta - Guinardó
20          Barcelona Capital                   Horta - Guinardó                                     Can Baró
21          Barcelona Capital                   Horta - Guinardó                             El Baix Guinardó

I have some duplicate rows I want to remove. The duplicates are the first item within each Distritos_Names "group". i.e. Ciutat Vella, Eixample, Gràcia, Horta - Guinardó etc. and as a result they are duplicated into Zonas_Names. That is, I want to remove the following:

Distritos_Names                                  Zonas_Names
Ciutat Vella                                 Ciutat Vella
Eixample                                     Eixample
Gràcia                                       Gràcia
Horta - Guinardó                             Horta - Guinardó

Since the names appear in both columns.

I have tried group_by(Municipios_Names, Distritos_Names) %>% slice(1) but this does not solve my issue. I run into issues when I have the following data.

130 L'Hospitalet de Llobregat            La Florida - Les Planes                      La Florida - Les Planes
131 L'Hospitalet de Llobregat            La Florida - Les Planes                                   La Florida
132 L'Hospitalet de Llobregat            La Florida - Les Planes                                   Les Planes
133 L'Hospitalet de Llobregat                      Santa Eulàlia                                Santa Eulàlia
134       Sant Adrià de Besòs                Sant Adrià de Besòs                          Sant Adrià de Besòs
135  Santa Coloma de Gramenet                      Can Franquesa                                Can Franquesa
136  Santa Coloma de Gramenet                        Can Mariner                                  Can Mariner
137  Santa Coloma de Gramenet                     Cementiri Vell                               Cementiri Vell
138  Santa Coloma de Gramenet                             Centre                                       Centre
139  Santa Coloma de Gramenet                           El Raval                                     El Raval
140  Santa Coloma de Gramenet                              Fondo                                        Fondo
141  Santa Coloma de Gramenet                         Guinardera                                   Guinardera
142  Santa Coloma de Gramenet                       Les Oliveres                                 Les Oliveres

I want to correctly remove:

130 L'Hospitalet de Llobregat            La Florida - Les Planes                      La Florida - Les Planes

Since there are more than one observation for L'Hospitalet de Llobregat and always the first observation in the group is the duplicate - but I don't want to remove:

133 L'Hospitalet de Llobregat                      Santa Eulàlia                                Santa Eulàlia

Since this is only a single observation for this group and is therefore not a duplicate. Additionally, I don't want to remove:

134       Sant Adrià de Besòs                Sant Adrià de Besòs                          Sant Adrià de Besòs

Since again this is a single observation for this group and is not a duplicate. So, I want to apply the slice(1) only to groups greater than 1 (or remove the first observation when Distritos_Names == Zonas_Names only when the size of the group > 1.

Data:

df <- structure(list(Municipios_Names = c("Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Barcelona Capital", "Barcelona Capital", 
"Barcelona Capital", "Badalona", "Badalona", "Badalona", "Badalona", 
"Badalona", "Badalona", "Badalona", "Badalona", "Badalona", "Badalona", 
"Badalona", "Badalona", "Badalona", "Badalona", "Badalona", "Badalona", 
"Badalona", "Badalona", "Badalona", "Badalona", "Badalona", "Badalona", 
"Badalona", "Badalona", "Badalona", "Badalona", "Badalona", "Badalona", 
"Badalona", "Badalona", "Badalona", "L'Hospitalet de Llobregat", 
"L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", 
"L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", 
"L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", 
"L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", 
"L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", 
"L'Hospitalet de Llobregat", "L'Hospitalet de Llobregat", "Sant Adrià de Besòs", 
"Santa Coloma de Gramenet", "Santa Coloma de Gramenet", "Santa Coloma de Gramenet", 
"Santa Coloma de Gramenet", "Santa Coloma de Gramenet", "Santa Coloma de Gramenet", 
"Santa Coloma de Gramenet", "Santa Coloma de Gramenet", "Santa Coloma de Gramenet", 
"Santa Coloma de Gramenet", "Santa Coloma de Gramenet", "Santa Coloma de Gramenet", 
"Santa Coloma de Gramenet", "Santa Coloma de Gramenet", "Santa Coloma de Gramenet"
), Distritos_Names = c("Ciutat Vella", "Ciutat Vella", "Ciutat Vella", 
"Ciutat Vella", "Ciutat Vella", "Eixample", "Eixample", "Eixample", 
"Eixample", "Eixample", "Eixample", "Eixample", "Gràcia", "Gràcia", 
"Gràcia", "Gràcia", "Gràcia", "Gràcia", "Horta - Guinardó", 
"Horta - Guinardó", "Horta - Guinardó", "Horta - Guinardó", 
"Horta - Guinardó", "Horta - Guinardó", "Horta - Guinardó", 
"Horta - Guinardó", "Horta - Guinardó", "Horta - Guinardó", 
"Horta - Guinardó", "Horta - Guinardó", "Les Corts", "Les Corts", 
"Les Corts", "Les Corts", "Nou Barris", "Nou Barris", "Nou Barris", 
"Nou Barris", "Nou Barris", "Nou Barris", "Nou Barris", "Nou Barris", 
"Nou Barris", "Nou Barris", "Nou Barris", "Nou Barris", "Nou Barris", 
"Nou Barris", "Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Andreu", 
"Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Andreu", "Sant Martí", 
"Sant Martí", "Sant Martí", "Sant Martí", "Sant Martí", "Sant Martí", 
"Sant Martí", "Sant Martí", "Sant Martí", "Sant Martí", "Sant Martí", 
"Sants - Montjuïc", "Sants - Montjuïc", "Sants - Montjuïc", 
"Sants - Montjuïc", "Sants - Montjuïc", "Sants - Montjuïc", 
"Sants - Montjuïc", "Sants - Montjuïc", "Sants - Montjuïc", 
"Sants - Montjuïc", "Sarrià - Sant Gervasi", "Sarrià - Sant Gervasi", 
"Sarrià - Sant Gervasi", "Sarrià - Sant Gervasi", "Sarrià - Sant Gervasi", 
"Sarrià - Sant Gervasi", "Sarrià - Sant Gervasi", "Artigues - Llefià", 
"Artigues - Llefià", "Artigues - Llefià", "Artigues - Llefià", 
"Bonavista - Bufalà - Morera", "Bonavista - Bufalà - Morera", 
"Bonavista - Bufalà - Morera", "Bonavista - Bufalà - Morera", 
"Canyet - Pomar", "Canyet - Pomar", "Canyet - Pomar", "Canyet - Pomar", 
"Casagemes - Canyadó", "Casagemes - Canyadó", "Casagemes - Canyadó", 
"Casagemes - Canyadó", "Centre Badalona", "Gorg - Progrés", 
"Gorg - Progrés", "Gorg - Progrés", "Gorg - Progrés", "Gorg - Progrés", 
"Montigalà - Sant Crist", "Montigalà - Sant Crist", "Montigalà - Sant Crist", 
"Montigalà - Sant Crist", "Port", "Salut - Lloreda", "Salut - Lloreda", 
"Salut - Lloreda", "Salut - Lloreda", "Bellvitge - El Gornal - Granvia LH", 
"Bellvitge - El Gornal - Granvia LH", "Bellvitge - El Gornal - Granvia LH", 
"Bellvitge - El Gornal - Granvia LH", "Can Serra - Pubilla Cases", 
"Can Serra - Pubilla Cases", "Can Serra - Pubilla Cases", "Centre - Sant Josep - Sanfeliu", 
"Centre - Sant Josep - Sanfeliu", "Centre - Sant Josep - Sanfeliu", 
"Centre - Sant Josep - Sanfeliu", "Collblanc - La Torrassa", 
"Collblanc - La Torrassa", "Collblanc - La Torrassa", "La Florida - Les Planes", 
"La Florida - Les Planes", "La Florida - Les Planes", "Santa Eulàlia", 
"Sant Adrià de Besòs", "Can Franquesa", "Can Mariner", "Cementiri Vell", 
"Centre", "El Raval", "Fondo", "Guinardera", "Les Oliveres", 
"Llatí", "Riera Alta", "Riu Nord", "Riu Sud", "Safaretjos", 
"Santa Rosa", "Singuerlín"), Zonas_Names = c("Ciutat Vella", 
"Barri Gòtic", "El Raval", "La Barceloneta", "Sant Pere, Sta. Caterina i la Ribera", 
"Eixample", "Dreta de l'Eixample", "Fort Pienc", "La Nova Esquerra de l'Eixample", 
"L'Antiga Esquerra de l'Eixample", "Sagrada Família", "Sant Antoni", 
"Gràcia", "El Camp d'en Grassot i Gràcia Nova", "El Coll", 
"La Salut", "Vallcarca i els Penitents", "Vila de Gràcia", "Horta - Guinardó", 
"Can Baró", "El Baix Guinardó", "El Carmel", "El Guinardó", 
"Horta", "La Clota", "La Font d'en Fargues", "La Teixonera", 
"La Vall d'Hebron", "Montbau", "Sant Genís dels Agudells", "Les Corts", 
"Barri de les Corts", "La Maternitat i Sant Ramon", "Pedralbes", 
"Nou Barris", "Can Peguera", "Canyelles", "Ciutat Meridiana", 
"El Turó de la Peira", "La Guineueta", "La Prosperitat", "La Trinitat Nova", 
"Les Roquetes", "Porta", "Torre Baró", "Vallbona", "Verdum", 
"Vilapicina i la Torre Llobeta", "Sant Andreu", "Baró de Viver", 
"El Bon Pastor", "El Congrés i els Indians", "La Sagrera", "Navas", 
"Sant Andreu del Palomar", "Trinitat Vella", "Sant Martí", "Diagonal Mar i el Front Marítim del Poblenou", 
"El Besós i el Maresme", "El Camp de l'Arpa del Clot", "El Clot", 
"El Parc i la Llacuna del Poblenou", "El Poblenou", "La Verneda i la Pau", 
"La Vila Olímpica del Poblenou", "Provençals del Poblenou", 
"Sant Martí de Provençals", "Sants - Montjuïc", "El Poble Sec - Parc de Montjuïc", 
"Hostafrancs", "La Bordeta", "La Font de la Guatlla", "La Marina del Port", 
"La Marina del Prat Vermell", "Sants", "Sants-Badal", "Zona Franca - Port", 
"Sarrià - Sant Gervasi", "El Putget i el Farró", "Les Tres Torres", 
"Sant Gervasi- Galvany", "Sant Gervasi i la Bonanova", "Sarrià", 
"Vallvidrera - Tibidabo - Les Planes", "Artigues - Llefià", 
"Artigues", "Llefià", "Sant Roc", "Bonavista - Bufalà - Morera", 
"Bonavista", "Bufalà", "Morera", "Canyet - Pomar", "Canyet", 
"Mas Ram", "Pomar", "Casagemes - Canyadó", "Canyadó", "Casagemes", 
"Manresà", "Centre Badalona", "Gorg - Progrés", "Congrés", 
"El Remei", "Gorg", "Progrés - Pep Ventura", "Montigalà - Sant Crist", 
"Montigalà", "Puigfred", "Sant Crist", "Port", "Salut - Lloreda", 
"La Salut", "Lloreda", "Sistrells", "Bellvitge - El Gornal - Granvia LH", 
"Bellvitge", "El Gornal", "Granvia LH", "Can Serra - Pubilla Cases", 
"Can Serra", "Pubilla Cases", "Centre - Sant Josep - Sanfeliu", 
"Centre", "Sanfeliu", "Sant Josep", "Collblanc - La Torrassa", 
"Collblanc", "La Torrassa", "La Florida - Les Planes", "La Florida", 
"Les Planes", "Santa Eulàlia", "Sant Adrià de Besòs", "Can Franquesa", 
"Can Mariner", "Cementiri Vell", "Centre", "El Raval", "Fondo", 
"Guinardera", "Les Oliveres", "Llatí", "Riera Alta", "Riu Nord", 
"Riu Sud", "Safaretjos", "Santa Rosa", "Singuerlín")), class = "data.frame", row.names = c(NA, 
-149L))

CodePudding user response:

You can filter for data that only has one record OR records with Zonas_Names different from the first record of Zonas_Names per group_by.

library(dplyr)

df %>% 
  group_by(Municipios_Names, Distritos_Names) %>% 
  filter(n() == 1 | Zonas_Names != first(Zonas_Names)) 

CodePudding user response:

A more explicit (and far less concise) way than Benson's, but the same outcome (127 rows).

df %>%
  group_by(Municipios_Names, Distritos_Names)%>%
  mutate(group_id = row_number(),
         max_group_id = max(group_id))%>%
  ungroup()%>%
  filter(group_id !=1 | max_group_id == 1)

CodePudding user response:

Not the most elegant solution but this will work.

Basically we use the grouped data to add a row number then ungroup and filter out any row numbers that equal 1

  library(tidyverse)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     -149L))
df %>% group_by(Municipios_Names,Distritos_Names) %>% 
  mutate(Zonas_Names=Zonas_Names,
         row_number=row_number(),
         max_row=max(row_number)) %>% 
  ungroup() %>% 
  filter(max_row==1 |row_number!=1) %>%
  dplyr::select(-row_number,max_row)
  •  Tags:  
  • r
  • Related