2017-07-20 1 views
4

Les résultats souhaités

Utilisation de la syntaxe simple que je filtre sur vs et am colonnes laissant également les valeurs cyl.Utiliser mécanisme de sélection comme pour sélectionner des variables pour appel distinctes dans dplyr

data(mtcars) 
dta <- mtcars[,c("vs", "am", "cyl")] 
# Desired results 
dta %>% distinct(vs, am, .keep_all = TRUE) 

syntaxe souhaitée

Je voudrais inverser la syntaxe ci-dessus et sélectionnez observations distinctes sur toutes les valeurs sauf la colonne cyl, correspondant à l'exemple ci-dessous:

dta %>% distinct(vars(-contains("cyl")), .keep_all = TRUE) 

qui naturellement ne fonctionne pas:

>> dta %>% distinct(vars(-contains("cyl")), .keep_all = TRUE) 
    vs am cyl vars(-contains("cyl")) 
1 0 1 6  ~-contains("cyl") 
2 0 1 6  ~-contains("cyl") 
3 1 1 4  ~-contains("cyl") 
4 1 0 6  ~-contains("cyl") 
5 0 0 8  ~-contains("cyl") 
6 1 0 6  ~-contains("cyl") 
7 0 0 8  ~-contains("cyl") 
+0

@akrun 'dim (DTA%>% distincte (vs, am, .keep_all = TRUE))' est '' 4 3' et dim (DTA%>% distincts (UQ (setdiff (noms (DTA), "cyl")), .keep_all = TRUE)) 'est **' 32 3' ** ou il me manque quelque chose? – Konrad

+0

@akrun Excuses, j'ai fait une faute de frappe et l'ai changé. Bien que, le point clé devrait être le même: sélectionnez toutes les colonnes moins un en distinct. – Konrad

+0

Je pense que je me suis trompé. Excuses de mon côté. – akrun

Répondre

2

Si cela ne vous dérange pas ne pas utiliser distinct, alors vous pouvez utiliser group_by_at avec slice pour obtenir le résultat souhaité, c'est-à-dire.

library(dplyr) 

dta %>% 
group_by_at(vars(-cyl)) %>% 
slice(1L) 

# A tibble: 4 x 3 
# Groups: vs, am [4] 
#  vs am cyl 
# <dbl> <dbl> <dbl> 
#1  0  0  8 
#2  0  1  6 
#3  1  0  6 
#4  1  1  4 
+1

Merci d'avoir contribué la réponse. Je vais accepter car il semble que la seule solution viable pour le moment. Je pense que je pourrais «dissocier» plus tard et arriver à un résultat identique, ce qui était l'objectif initial. – Konrad

+0

@Konrad, exactement. Dégroupez, arrangez et vous êtes prêt à partir – Sotos

+1

L'alternative potentielle serait d'envelopper cette fonction, en faisant: 'deparse (substitute (cyl))', puis en créant des quosures à partir des colonnes restantes dans 'names (dta)' à passer '' distinc' - ne vaut pas la peine. – Konrad