Removendo casos incompletos da saída de tidyr - Gather() - r
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")
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)