R's duplicated
retorna um vetor que mostra se cada elemento de um vetor ou quadro de dados é uma duplicata de um elemento com um subscrito menor. Então, se as linhas 3, 4 e 5 de um quadro de dados de 5 linhas forem iguais, duplicated
me dará o vetor
FALSE, FALSE, FALSE, TRUE, TRUE
Mas, neste caso, eu realmente quero obter
FALSE, FALSE, TRUE, TRUE, TRUE
ou seja, quero saber se uma linha é duplicada por uma linha com um subscrito maior também.
fonte
x <- c(1:9, 7:10, 5:22); y <- c(letters, letters[1:5]); test <- data.frame(x, y); test[duplicated(test$x) | duplicated(test$x, fromLast=TRUE), ]
devolvi todas as três cópias de 7, 8 e 9. Por que isso funciona?duplicated(c(1,1,1))
vsduplicated(c(1,1,1,), fromLast = TRUE)
dác(FALSE,TRUE,TRUE)
ec(TRUE,TRUE,FALSE)
. O valor médio éTRUE
em ambos os casos. A obtenção|
de ambos os vetores dác(TRUE,TRUE,TRUE)
.Você precisa montar o conjunto de
duplicated
valores, aplicarunique
e depois testar com%in%
. Como sempre, um problema de amostra dará vida a esse processo.fonte
duplicated
,unique
e%in%
pode ser facilmente generalizado para uma trama de dados se alguém fosse primeiropaste
de cada linha com um caractere separador incomum. (A resposta aceita é melhor.)Já tive a mesma pergunta e, se não me engano, esta também é uma resposta.
Não sei qual é o mais rápido, porém, o conjunto de dados que estou usando atualmente não é grande o suficiente para fazer testes que produzem lacunas de tempo significativas.
fonte
vec
tanto como vetor atômico quanto como dataframe. Eu suspeito que com um datframe real ele falhará.As linhas duplicadas em um dataframe podem ser obtidas
dplyr
fazendoPara excluir certas colunas
group_by_at(vars(-var1, -var2))
pode ser usado em vez de agrupar os dados.Se os índices de linha, e não apenas os dados, forem realmente necessários, você pode adicioná-los primeiro como em:
fonte
n()
. Não se esqueça de desagrupar o dataframe resultante.Aqui está a solução de @Joshua Ulrich como uma função. Este formato permite que você use este código da mesma maneira que usaria duplicado ():
Usando o mesmo exemplo:
fonte
Se você estiver interessado em saber quais linhas são duplicadas para certas colunas, você pode usar uma abordagem plyr :
Adicionando uma variável de contagem com dplyr :
Para linhas duplicadas (considerando todas as colunas):
A vantagem dessas abordagens é que você pode especificar quantas repetições como um corte.
fonte
Eu tive um problema semelhante, mas precisava identificar linhas duplicadas por valores em colunas específicas. Eu vim com a seguinte solução dplyr :
O código agrupa as linhas por colunas específicas. Se o comprimento de um grupo for maior que 1, o código marca todas as linhas do grupo como duplicadas. Depois de fazer isso, você pode usar a
Duplicated
coluna para filtrar etc.fonte