Suppression des cas incomplets de la sortie de Tidyr - recueillir() - r
Question
J'ai des données désordonnées dans une trame de données qui ressemble à ceci.
Ici vous pouvez voir dans « équipe » les noms de certaines équipes de football.Name1-3 sont des variables répertoriant les différents noms utilisés pour désigner ces équipes dans la première colonne.
team name1 name2 name3
1 Loughborough Loughborough
2 Luton Town Luton Town Luton
3 Macclesfield Macclesfield
4 Maidstone United Maidstone United
5 Manchester City Manchester City Man City
6 Manchester United Manchester United Newton Heath Man United
7 Mansfield Town Mansfield Town Mansfield
8 Merthyr Town Merthyr Town
Mon objectif est de regrouper les données en 2 colonnes avec des paires team-name1, team-name2, team-name3.Je souhaite uniquement conserver les paires où il y a des données dans name1, name2 ou name3.
Pour ce faire, j'essaie de ranger's- gather()
temp <- dat %>% gather(key, value, 2:4)
temp$key<-NULL
temp
Cela donne le résultat suivant :
team value
1 Loughborough Loughborough
2 Luton Town Luton Town
3 Macclesfield Macclesfield
4 Maidstone United Maidstone United
5 Manchester City Manchester City
6 Manchester United Manchester United
7 Mansfield Town Mansfield Town
8 Merthyr Town Merthyr Town
9 Loughborough
10 Luton Town Luton
11 Macclesfield
12 Maidstone United
13 Manchester City Man City
14 Manchester United Newton Heath
15 Mansfield Town Mansfield
16 Merthyr Town
17 Loughborough
18 Luton Town
19 Macclesfield
20 Maidstone United
21 Manchester City
22 Manchester United Man United
23 Mansfield Town
24 Merthyr Town
J'ai essayé de supprimer les cas incomplets (par ex.lignes 20,21, 23,24 mais pas 22), en utilisant :
temp[complete.cases(temp),]
Cela n'a pas fonctionné car les observations de valeurs apparemment vides contiennent un caractère "" - je suppose que c'est ainsi que gather()
renvoie les données manquantes ?.J'ai essayé de convertir temp$value
à un facteur mais cela n'a pas fonctionné non plus.
J'aimerais savoir comment se débarrasser des dossiers incomplets.
Exemples de données...
dat<-structure(list(team = structure(1:8, .Label = c("Loughborough",
"Luton Town", "Macclesfield", "Maidstone United", "Manchester City",
"Manchester United", "Mansfield Town", "Merthyr Town"), class = "factor"),
name1 = structure(1:8, .Label = c("Loughborough", "Luton Town",
"Macclesfield", "Maidstone United", "Manchester City", "Manchester United",
"Mansfield Town", "Merthyr Town"), class = "factor"), name2 = structure(c(1L,
2L, 1L, 1L, 3L, 5L, 4L, 1L), .Label = c("", "Luton", "Man City",
"Mansfield", "Newton Heath"), class = "factor"), name3 = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 1L, 1L), .Label = c("", "Man United"), class = "factor")), .Names = c("team",
"name1", "name2", "name3"), row.names = c(NA, -8L), class = "data.frame")
La solution
Vous pourriez également ajouter filter
(afin de supprimer les blancs) et select
(afin de supprimer key
colonne) de dplyr
emballez et obtenez tout en une seule fois
temp <- dat %>%
gather(key, value, 2:4) %>%
filter(value != "") %>%
select(-key)
# team value
# 1 Loughborough Loughborough
# 2 Luton Town Luton Town
# 3 Macclesfield Macclesfield
# 4 Maidstone United Maidstone United
# 5 Manchester City Manchester City
# 6 Manchester United Manchester United
# 7 Mansfield Town Mansfield Town
# 8 Merthyr Town Merthyr Town
# 9 Luton Town Luton
# 10 Manchester City Man City
# 11 Manchester United Newton Heath
# 12 Mansfield Town Mansfield
# 13 Manchester United Man United
Autres conseils
Cherchez-vous: temp[temp$value!='',]
? gather
n'est pas à blâmer pour les chaînes vides, vos données initiales les contenaient également.Vous pouvez d'abord les remplacer, puis utiliser le na.rm
argument dans gather
:
dat[dat==''] <- NA
temp <- dat %>% gather(key, value, 2:4, na.rm=TRUE)
temp$key<-NULL
tempA
approche similaire, mais en utilisant na.omit :
dat %>%
gather(key, value, -team) %>%
select(-key) %>%
mutate(value = ifelse(value == "", NA, value)) %>%
na.omit %>%
arrange(team)