HOWTO · R
Remova linhas duplicadas por coluna em R
Este artigo demonstra como remover linhas duplicadas por coluna em R
Nesta página
Para manter uma linha para cada chave selecionada em um data frame do R, use distinct() do dplyr com .keep_all = TRUE quando precisar das outras colunas. Cada método abaixo mantém a linha correspondente mais antiga na ordem atual dos dados, portanto, ordene primeiro quando outro registro deve ter prioridade. Os exemplos usam um pequeno data frame com as colunas id, group e score.
Use a função distinct do pacote dplyr para remover linhas duplicadas por coluna em R
Use distinct(df, id, .keep_all = TRUE) quando id define um registro único e você quer todas as colunas originais no resultado. distinct() compara as colunas-chave selecionadas e mantém a primeira linha para cada valor de chave. Com .keep_all = TRUE, as outras colunas são transportadas para o resultado, mas não afetam se duas linhas correspondem. Sem esse argumento, o resultado contém apenas as colunas selecionadas.
Para uma chave composta, liste cada coluna: distinct(df, id, group, .keep_all = TRUE). Linhas com o mesmo id, mas valores de group diferentes, permanecem então separadas. O exemplo completo a seguir usa os mesmos dados de amostra e mostra ambas as escolhas de chave. Ele requer que o dplyr esteja instalado; seus resultados são descritos abaixo, e este exemplo não é acompanhado por saída em tempo de execução.
df <- data.frame(
id = c(1, 2, 2, 3, 3),
group = c("A", "A", "B", "A", "B"),
score = c(8, 5, 9, 4, 7)
)
if (requireNamespace("dplyr", quietly = TRUE)) {
unique_by_id <- dplyr::distinct(df, id, .keep_all = TRUE)
unique_by_pair <- dplyr::distinct(df, id, group, .keep_all = TRUE)
print(unique_by_id)
print(unique_by_pair)
} else {
cat("Install dplyr to run these distinct() examples.\n")
}
O resultado de chave única mantém (1, A, 8), (2, A, 5) e (3, A, 4). O resultado de chave composta mantém essas linhas mais (2, B, 9) e (3, B, 7), porque cada par de id e group é único. O exemplo separado a seguir em R base imprime ambos os resultados.
df <- data.frame(
id = c(1, 2, 2, 3, 3),
group = c("A", "A", "B", "A", "B"),
score = c(8, 5, 9, 4, 7)
)
unique_by_id <- df[!duplicated(df$id), ]
unique_by_pair <- df[!duplicated(df[c("id", "group")]), ]
cat("By id:\n")
cat(paste(unique_by_id$id, unique_by_id$group, unique_by_id$score, sep = ":"), sep = "\n")
cat("\nBy id and group:\n")
cat(paste(unique_by_pair$id, unique_by_pair$group, unique_by_pair$score, sep = ":"), sep = "\n")
By id:
1:A:8
2:A:5
3:A:4
By id and group:
1:A:8
2:A:5
2:B:9
3:A:4
3:B:7
Aqui, !duplicated(df$id) marca as ocorrências posteriores de cada id; passar um data frame de colunas-chave para duplicated() aplica a mesma regra de primeira ocorrência à sua combinação. Ambas as seleções mantêm todas as colunas de cada linha escolhida.
Use as funções group_by, filter e duplicated para remover linhas duplicadas por coluna em R
Para uma única chave global id, filter(!duplicated(id)) mantém sua primeira ocorrência. Se a entrada já puder estar agrupada, chame ungroup() primeiro para que filter() avalie a verificação de duplicatas sobre todos os dados:
df %>% ungroup() %>% filter(!duplicated(id))
O pipe %>% passa o valor à sua esquerda como o primeiro argumento para a função à sua direita. Agrupar por id antes de filter(!duplicated(id)) não remove as linhas posteriores: dentro de cada grupo id, essa chave é constante, portanto duplicated(id) não encontra nenhuma ocorrência posterior. Agrupar por outra coluna é útil quando os IDs podem se repetir independentemente dentro de cada grupo; então duplicated(id) mantém a primeira ocorrência de cada ID em cada grupo. Para uma única chave global, a expressão não agrupada tem o mesmo comportamento de primeira linha que a seleção em R base acima.
Por exemplo, agrupar por group aplica a mesma verificação separadamente dentro de cada grupo:
df %>%
group_by(group) %>%
filter(!duplicated(id)) %>%
ungroup()
Esse pipeline mantém a primeira linha para cada id dentro de cada group, de acordo com a ordem atual das linhas. Nos dados de amostra, cada par de id e group ocorre apenas uma vez, portanto cada linha é a primeira ocorrência de seu id dentro de seu grupo e todas as cinco linhas são mantidas; uma linha adicional que repetisse um id já visto no mesmo grupo seria descartada.
Use as funções group_by e slice para remover linhas duplicadas por coluna em R
O pipeline do dplyr df %>% group_by(id) %>% slice(1) %>% ungroup() seleciona a posição 1 de cada grupo id. A ordem atual das linhas determina qual registro é o primeiro; slice(1) não seleciona automaticamente a maior pontuação ou o registro mais recente. Organize os dados de acordo com a preferência desejada antes de agrupar e fatiar, e depois desagrupe quando as operações posteriores devam tratar o resultado como um data frame comum.
Para os dados de amostra, esse método mantém as mesmas linhas que as abordagens distinct() e duplicated() de chave única: a primeira linha para os IDs 1, 2 e 3. Use distinct() quando a tarefa é selecionar combinações de chaves únicas; use slice(1) quando selecionar uma linha pela sua posição dentro de cada grupo faz parte de um fluxo de trabalho agrupado mais amplo. Essas expressões do dplyr são ilustrativas e requerem o pacote dplyr; o exemplo em R base acima é executado sem essa dependência.