Pergunta

Tenho dados desordenados em um dataframe parecido com este.

Aqui você pode ver em ‘time’ os nomes de alguns times de futebol.Name1-3 são variáveis ​​que listam os diferentes nomes usados ​​para se referir a essas equipes na primeira coluna.

               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                        

Meu objetivo é colocar os dados em 2 colunas com pares team-name1, team-name2, team-name3.Quero apenas manter os pares onde há dados em nome1, nome2 ou nome3.

Para fazer isso, estou tentando arrumar- gather()

temp <- dat %>% gather(key, value, 2:4) 
temp$key<-NULL
temp

Isso fornece a seguinte saída:

                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                  

Tentei remover casos incompletos (por exemplolinhas 20,21, 23,24, mas não 22), usando:

temp[complete.cases(temp),]

Isso não funcionou porque as observações de valor aparentemente vazias contêm um caractere "" - acho que é assim gather() retorna dados ausentes?.Eu tentei converter temp$value para um fator, mas isso também não funcionou.

Eu adoraria saber como me livrar dos casos incompletos.

Dados de amostra...

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

Solução

Você também pode adicionar filter (para remover espaços em branco) e select (para remover key coluna) de dplyr empacote e receba tudo de uma só 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

Outras dicas

Você está procurando: temp[temp$value!='',]? gather não é culpado pelas strings vazias, seus dados iniciais também as tinham.Você pode substituí-los primeiro e depois usar o na.rm argumento em gather:

dat[dat==''] <- NA
temp <- dat %>% gather(key, value, 2:4, na.rm=TRUE) 
temp$key<-NULL
tempA

abordagem semelhante, mas fazendo uso de na.omit:

dat %>% 
  gather(key, value, -team) %>% 
  select(-key) %>%
  mutate(value = ifelse(value == "", NA, value)) %>%
  na.omit %>%
  arrange(team)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top