103 votes

Unique sur un dataframe avec uniquement les colonnes sélectionnées

J'ai un dataframe avec >100 colonnes, et je voudrais trouver les lignes uniques en ne comparant que deux des colonnes. J'espère que c'est facile, mais je n'arrive pas à le faire fonctionner moi-même avec unique ou duplicated.

Dans l'exemple ci-dessous, je voudrais obtenir les valeurs uniques uniquement en utilisant id et id2:

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 pour quelle ligne unique est gardée)

147voto

joran Points 68079

D'accord, si cela n'a pas d'importance quelle valeur dans la colonne non dupliquée vous sélectionnez, cela devrait être assez facile :

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 passe simplement uniquement les colonnes de dat dont je ne veux pas de doublons. Ce code sélectionnera automatiquement toujours le premier des valeurs ambiguës. (Dans ce cas, x.)

42voto

sbha Points 1948

Voici quelques options dplyr qui permettent de conserver les lignes non dupliquées basées sur les 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)

16voto

Gary Feng Points 380

En utilisant 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")])),]

1voto

Vaya Ashish Points 11

Mise à jour mineure dans le code de @Joran.
En utilisant le code ci-dessous, vous pouvez éviter l'ambiguïté et obtenir uniquement les valeurs uniques 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")]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X