2015-10-22 6 views
8

Spesso desidero selezionare un sottoinsieme di variabili in cui il sottoinsieme è il risultato di una funzione. In questo semplice caso, in primo luogo ho ottenere tutti i nomi delle variabili che riguardano le caratteristiche di larghezzaUtilizzo di dplyr's seleziona dove vengono indicati i nomi delle variabili

library(dplyr) 
library(magrittr) 

data(iris) 

width.vars <- iris %>% 
       names %>% 
       extract(grep(".Width", .)) 

che restituisce:

>width.vars 
[1] "Sepal.Width" "Petal.Width" 

sarebbe utile per essere in grado di utilizzare queste dichiarazioni come un modo per selezionare colonne (e anche se sono a conoscenza del fatto che e i suoi fratelli esistono, ci sono molti sottoinsiemi più complicati che vorrei eseguire, e questo esempio è reso banale ai fini di questo esempio

Se dovessi tentare usare questa funzione come aw ay per selezionare le colonne, accade quanto segue:

iris %>% 
    select(Species, 
     width.vars) 

Error: All select() inputs must resolve to integer column positions. 
The following do not: 
* width.vars 

Come posso utilizzare dplyr::select con un vettore di nomi di variabili memorizzate come stringhe?

risposta

17

All'interno di dplyr, la maggior parte dei comandi ha una versione alternativa che termina con un '_' che accetta le stringhe come input; in questo caso, select_. Questi sono in genere ciò che è necessario utilizzare quando si utilizza dplyr a livello di programmazione.

iris %>% select_(.dots=c("Species",width.vars)) 
5

Prima di tutto, si può fare la selezione nella dplyr con

iris %>% select(Species, contains(".Width")) 

Non c'è bisogno di creare il vettore dei nomi separatamente. Ma se si ha avuto un elenco di colonne come nomi di stringa, si potrebbe fare

width.vars <- c("Sepal.Width", "Petal.Width") 
iris %>% select(Species, one_of(width.vars)) 

vedere la pagina ?select aiuto per tutte le opzioni disponibili.

+1

grazie per la risposta, ma come ho detto nella domanda, sono a conoscenza di 'select', e sono interessato a quei casi in cui volevo eseguire una funzione più complicata su un insieme di variabili nomi. – tomw

+2

Questo è ciò che 'one_of' farebbe come mostrato sopra. – MrFlick

Problemi correlati