2013-06-12 24 views
21

Mi chiedo come utilizzare la funzione subset se non conosco il nome della colonna che voglio testare. Lo scenario è questo: ho un'app Shiny in cui l'utente può scegliere una variabile su cui filtrare (sottoinsieme) la tabella dei dati. Ricevo il nome della colonna dalla webapp come input, e voglio sottoinsieme in base al valore di quella colonna, in questo modo:Sottoinsieme basato sul nome della colonna variabile

subset(myData, THECOLUMN == someValue) 

Eccetto dove sia THECOLUMN e someValue sono variabili. Esiste una sintassi per il passaggio del nome colonna desiderato come stringa?

Sembra voler un bareword che è il nome della colonna, non una variabile che contiene il nome della colonna.

risposta

20

Proprio per questo subset è una cattiva strumento per qualcosa di diverso da un uso interattivo:

d <- data.frame(x = letters[1:5],y = runif(5)) 
> d[d[,'x'] == 'c',] 
    x   y 
3 c 0.3080524 

Fondamentalmente, l'estrazione di cose in R è costruito intorno [. Usalo.

+0

Sembra che faccia ciò che voglio, ma non l'ho ancora verificato. La contrassegnerò come risposta e follow-up se avessi problemi. – adv12

+0

A rischio di sembrare stupido, questo differisce se sto usando un data.table piuttosto che un data.frame? Sembra che. Con data.table, posso usare "d [d [, theColumnName] == 'c',]", ma non riesco a usare "d [d," theColumnName "] == 'c ',]". – adv12

+0

@ adv12 No, 'data.table's funziona in modo diverso e (IMHO) incredibilmente ottusamente (con mia immensa e ripetuta frustrazione). Credo che il data.table debba essere digitato per fare ciò: 'setkey (d," x "); d [ "c"] '. Ma ho sempre trovato dati.la sintassi della tabella è così opaca che di solito finisco con il considerare i metodi "più semplici". – joran

21

Entrambe subset e with sono progettate per l'uso interattivo e le avvertenze relative al loro utilizzo all'interno di altre funzioni si troveranno nelle relative pagine di aiuto. Ciò deriva dalla loro strategia di argomenti di valutazione come espressioni all'interno di un ambiente costruito dai nomi dei loro argomenti di dati. Questi nomi colonna/elemento non sarebbero altrimenti "oggetti" in senso R.

Se THECOLUMN è il nome di un oggetto il cui valore è il nome della colonna e someValue è il nome di un oggetto il cui valore è il bersaglio, allora dovreste usare:

dfrm[ dfrm[[THECOLUMN]] == someValue , ] 

Il fatto che " [["valuterà la sua argomentazione è perché è superiore a" $ "per la programmazione. Se usiamo l'esempio di Joran:

d <- data.frame(x = letters[1:5],y = runif(5)) 
THECOLUMN= "x" 
someValue= "c" 

d[ d[[THECOLUMN]] == someValue , ] 
# x   y 
# 3 c 0.7556127 

Quindi in questo caso tutte queste restituiscono lo stesso vettore atomica:

d[[ THECOLUMN ]] 
d[[ 'x' ]] 
d[ , 'x' ] 
d[, THECOLUMN ] 
d$x # of the three extraction functions: `$`, `[[`, and `[`, 
    # only `$` is unable to evaluate its argument 
3

Penso che si potrebbe utilizzare il seguente one-liner:

myData[ , grep(someValue, colnames(myData))] 

dove

colnames(myData) 

produce un vettore c ontaining tutti i nomi di colonna e

grep(someValue, colnames(myData)) 

dovrebbe risultati in un vettore numerico di lunghezza 1 (dato il nome della colonna è unico) che puntano al tuo colonna. Vedere ?grep per informazioni sulla corrispondenza del modello in R.

Problemi correlati