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")
¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top