web-dev-qa-db-fra.com

R équivalent de SELECT DISTINCT sur plusieurs champs/variables

Supposons que j'ai un cadre de données df avec deux colonnes ou plus, existe-t-il un moyen simple d'utiliser unique() ou une autre fonction R pour créer un sous-ensemble de combinaisons uniques de deux colonnes ou plus?

Je sais que je peux utiliser sqldf() et écrire une requête "SELECT DISTINCT var1, var2, ... varN" facile, mais je cherche un moyen de le faire.

Il m’est venu à l’esprit d’essayer ftable de contraindre à un dataframe et d’utiliser les noms de champs, mais j’obtiens également les totalisations croisées de combinaisons qui n’existent pas dans le jeu de données:

uniques <- as.data.frame(ftable(df$var1, df$var2))
21
wahalulu

unique fonctionne sur data.frame donc unique(df[c("var1","var2")]) devrait être ce que vous voulez.

Une autre option est distinct à partir de dplyr package :

df %>% distinct(var1, var2) # or distinct(df, var1, var2)

Remarque:

Pour les anciennes versions de dplyr ( <0.5.0, 2016-06-24 ) distinct étape supplémentaire requise

df %>% select(var1, var2) %>% distinct

(ou façon ancienne distinct(select(df, var1, var2))).

36
Marek

La réponse de @ Marek est évidemment correcte, mais peut être dépassée. La version actuelle de dplyr (0.7.4) permet un code encore plus simple:

Utilisez simplement:

df %>% distinct(var1, var2)

Si vous voulez conserver toutes les colonnes, ajoutez 

df %>% distinct(var1, var2, .keep_all = TRUE)
2
Tjebo

Pour GARDER toutes les autres variables de df, utilisez ceci:

unique_rows <- !duplicated(df[c("var1","var2")])

unique.df <- df[unique_rows,]

Une autre méthode moins recommandée utilise row.names () # (voir le commentaire de David ci-dessous):

unique_rows <- row.names(unique(df[c("var1","var2")]))

unique.df <- df[unique_rows,]
0
sbaniwal