web-dev-qa-db-fra.com

Comment supprimer les noms de colonnes en double dans R?

J'ai une très grosse matrice, je sais que certains de leurs noms sont dupliqués. donc je veux juste trouver ces noms de fichiers dupliqués et supprimer de la colonne de dupliquer. J'ai essayé duplicate(), mais cela supprime les entrées en double. Est-ce que quelqu'un pourrait m'aider à implémenter ceci dans R? Le fait est que, les noms de fichiers en double, pourraient ne pas avoir d'entiers en double.

12
user2806363

Disons que temp est votre matrice

temp <- matrix(seq_len(15), 5, 3)
colnames(temp) <- c("A", "A", "B")

##      A  A  B
## [1,] 1  6 11
## [2,] 2  7 12
## [3,] 3  8 13
## [4,] 4  9 14
## [5,] 5 10 15

Vous pourriez faire

temp <- temp[, !duplicated(colnames(temp))]

##      A  B
## [1,] 1 11
## [2,] 2 12
## [3,] 3 13
## [4,] 4 14
## [5,] 5 15

Ou, si vous voulez conserver la dernière colonne dupliquée, vous pouvez faire

temp <- temp[, !duplicated(colnames(temp), fromLast = TRUE)] 

##       A  B
## [1,]  6 11
## [2,]  7 12
## [3,]  8 13
## [4,]  9 14
## [5,] 10 15
36
David Arenburg

Ou en supposant que data.frames vous pouvez utiliser subset:

subset(iris, select=which(!duplicated(names(.)))) 

Notez que dplyr::select n'est pas applicable ici car il nécessite déjà l'unicité des colonnes dans les données d'entrée. 

12
Holger Brandl

Stockez tous vos doublons dans un seul vecteur, par exemple, et utilisez -duplications avec un seul jeu de crochets pour supprimer les colonnes en double.

       # Define vector of duplicate cols (don't change)
       duplicates <- c(4, 6, 11, 13, 15, 17, 18, 20, 22, 
            24, 25, 28, 32, 34, 36, 38, 40, 
            44, 46, 48, 51, 54, 65, 158)

      # Remove duplicates from food and assign it to food2
         food2 <- food[,-duplicates]
1
saswat prusty

Pour supprimer une colonne en double spécifique par son nom, vous pouvez procéder comme suit:

test = cbind(iris, iris) # example with multiple duplicate columns
idx = which(duplicated(names(test)) & names(test) == "Species")
test = test[,-idx]

Pour supprimer toutes les colonnes dupliquées, c'est un peu plus simple:

test = cbind(iris, iris) # example with multiple duplicate columns
idx = which(duplicated(names(test)))
test = test[,-idx]

ou:

test = cbind(iris, iris) # example with multiple duplicate columns
test = test[,!duplicated(names(test))]
0
Adam Erickson