web-dev-qa-db-fra.com

Unique sur une base de données avec uniquement des colonnes sélectionnées

J'ai une base de données avec> 100 colonnes et je voudrais trouver les lignes uniques en comparant seulement deux des colonnes. J'espère que c'est facile, mais je ne peux pas le faire fonctionner avec unique ou duplicated moi-même.

Dans la liste ci-dessous, je voudrais utiliser uniquement id et id2 comme suit:

data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))

id id2 somevalue
1   1         x
1   1         y
3   4         z

Je voudrais obtenir soit:

id id2 somevalue
1   1         x
3   4         z

ou:

id id2 somevalue
1   1         y
3   4         z

(Je n'ai pas de préférence laquelle des lignes uniques est conservée)

62
Ina

Ok, peu importe la valeur sélectionnée dans la colonne non dupliquée, cela devrait être assez simple:

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
  id id2 somevalue
1  1   1         x
3  3   4         z

À l'intérieur de l'appel duplicated, je ne fais que passer les colonnes de dat dont je ne veux pas de doublons. Ce code sélectionnera toujours automatiquement le premier de toutes les valeurs ambiguës. (Dans ce cas, x.)

102
joran

Utilisation de unique():

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])),]
13
Gary Feng

Voici quelques options dplyr qui conservent les lignes non dupliquées en fonction des colonnes id et id2:

library(dplyr)                                        
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)
10
sbha

Mise à jour mineure dans le code de @ Joran.
En utilisant le code ci-dessous, vous pouvez éviter l’ambiguïté et obtenir uniquement l’unique de deux colonnes:

dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]
1
Vaya Ashish