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)