Eliminando casos incompletos de la salida de tidyr - together() - r
Pregunta
Tengo datos desordenados en un marco de datos que se parece a este.
Aquí puedes ver en 'equipo' los nombres de algunos equipos de fútbol.Los nombres 1-3 son variables que enumeran los diferentes nombres utilizados para referirse a estos equipos en la primera columna.
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
Mi objetivo es obtener los datos en 2 columnas con pares de nombre de equipo1, nombre de equipo2, nombre de equipo3.Solo quiero conservar aquellos emparejamientos donde hay datos en nombre1, nombre2 o nombre3.
Para hacer esto, estoy probando tidyr's- gather()
temp <- dat %>% gather(key, value, 2:4)
temp$key<-NULL
temp
Esto da el siguiente resultado:
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
Intenté eliminar casos incompletos (p. ej.filas 20,21, 23,24 pero no 22), usando:
temp[complete.cases(temp),]
Esto no funcionó ya que las observaciones de valores aparentemente vacías contienen un carácter "". Supongo que así es como gather()
devuelve datos faltantes?.Intenté convertir temp$value
a un factor pero esto tampoco funcionó.
Me encantaría saber cómo deshacerme de los casos incompletos.
Data de muestra...
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")
Solución
También puede agregar filter
(para eliminar espacios en blanco) y select
(para eliminar la columna key
) del paquete dplyr
y obtenga todo en una sola vez
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
Otros consejos
Estás buscando: temp[temp$value!='',]
? gather
No se debe culpar a las cadenas vacías, sus datos iniciales también las tenían.Podrías reemplazarlos primero y luego usar el na.rm
argumento en gather
:
dat[dat==''] <- NA
temp <- dat %>% gather(key, value, 2:4, na.rm=TRUE)
temp$key<-NULL
tempA
enfoque similar, pero haciendo uso de na.omit:
dat %>%
gather(key, value, -team) %>%
select(-key) %>%
mutate(value = ifelse(value == "", NA, value)) %>%
na.omit %>%
arrange(team)