2010-07-30 19 views
18

Dove posso trovare informazioni sulle differenze tra chiamare su una colonna all'interno di un data.frame tramite:

df <- data.frame(x=1:20,y=letters[1:20],z=20:1) 

df$x 
df["x"] 

Entrambi restituire i "stessi" risultati, ma non necessariamente nello stesso formato. Un'altra cosa che ho notato è che df $ x restituisce una lista. Mentre df ["x"] restituisce un data.frame.

MODIFICA: Tuttavia, sapere quale utilizzare in quale situazione è diventata una sfida. Esiste una best practice qui o in realtà si tratta di sapere cosa richiede il comando o la funzione? Finora ho appena passato in rassegna i file se la mia funzione non ha funzionato all'inizio (tentativi ed errori).

risposta

13

Se non mi sbaglio, df$x è lo stesso di df[['x']]. [[ viene utilizzato per selezionare un singolo elemento, mentre [ restituisce un elenco degli elementi selezionati. Vedi anche the language reference. Di solito vedo che [[è usato per le liste, [per gli array e $ per ottenere una singola colonna o elemento. Se hai bisogno di un'espressione (per esempio df [[nome]] o df [, nome]), quindi usa anche [o [[notazione anche. La [notazione viene utilizzata anche se sono selezionate più colonne. Ad esempio df [, c ('name1', 'name2')]. Non penso che ci siano le migliori pratiche per questo.

+0

se 'df <- data.frame (xx = 1); df $ x! = df [['x'] 'come ho scoperto qui: http://stackoverflow.com/q/17349485/199217 –

0

df$x e df[[x]] fanno la stessa cosa.

Supponiamo di disporre di un set di dati denominato one. Una di queste variabili è una variabile fattore, Region. L'utilizzo di one$Region ti consentirà di selezionare una variabile specifica. Considerare quanto segue:

one <- read.csv("IED.csv") 
one$Region 

L'esecuzione del codice seguente consente inoltre di isolare tale variabile/livello.

one[["Region"]] 

Ogni codice produce il seguente output:

> one$Region 
    [1] RC SOUTH  RC SOUTH  RC SOUTH  RC EAST  RC EAST  
    [6] RC EAST  RC EAST  RC EAST  RC EAST  RC EAST  
    [11] RC SOUTH  RC SOUTH  RC EAST  RC EAST  RC EAST  
    [16] RC EAST  RC EAST  RC SOUTH  RC SOUTH  RC EAST  
    [21] RC SOUTH  RC EAST  RC CAPITAL RC EAST  RC EAST 


> one[["Region"]] 
    [1] RC SOUTH  RC SOUTH  RC SOUTH  RC EAST  RC EAST  
    [6] RC EAST  RC EAST  RC EAST  RC EAST  RC EAST  
    [11] RC SOUTH  RC SOUTH  RC EAST  RC EAST  RC EAST  
    [16] RC EAST  RC EAST  RC SOUTH  RC SOUTH  RC EAST  
    [21] RC SOUTH  RC EAST  RC CAPITAL RC EAST  RC EAST 

"Entrambi restituiscono gli stessi '' risultati, ma non necessariamente nello stesso formato." - Non ho notato alcuna differenza. Ogni comando ha prodotto le stesse uscite nello stesso formato. Forse sono i tuoi dati.

Spero che questo aiuti.

MODIFICA:

Non ha letto la domanda originale. df["x"] produce il seguente:

> one["Region"] 
      Region 
1   RC SOUTH 
2   RC SOUTH 
3   RC SOUTH 
4   RC EAST 
5   RC EAST 
6   RC EAST 
7   RC EAST 
8   RC EAST 
9   RC EAST 
10   RC EAST 

Non certo perché si verifica la differenza.

+0

Non hai notato alcuna differenza perché stai guardando qualcosa di leggermente diverso da quello che ha chiesto. La domanda riguarda la differenza tra df $ xe df ["x"] (parentesi singole), ma stai parlando di df $ xe df [["x"]] (parentesi DOUBLE). – Fojtasek

16

Un'altra differenza è che df$w restituisce NULL e df['w'] o df[['w']] restituisce un errore con il tuo esempio di dataframe.

+2

Questo è un punto cruciale. – Shane

+0

Sì, una considerazione è se si desidera che fallisca silenziosamente se si è sbagliato a digitare il nome della colonna. Durante lo sviluppo, questo è di solito indesiderabile, quindi vuoi cogliere l'errore. – smci

5

Se si utilizza df [, "x"] invece di df ["x"] si otterrà lo stesso risultato di df $ x. La virgola indica che stai selezionando una colonna per nome.

9

Oltre alla pagina di indicizzazione nel manuale, è possibile trovare questa descrizione sintetica nella pagina di aiuto?"$":

indicizzazione da ‘[’ è simile a quello atomico vettori e sceglie un elenco dell'elemento specificato (s).

Entrambi '[[' e '$' seleziona un singolo elemento della lista. La differenza principale di è che '$' non consente gli indici calcolati , mentre '[[' fa. 'x $ nome' è equivalente a 'x [["nome", exact = FALSE]]'. Inoltre, il comportamento di corrispondenza parziale di di [['può essere controllato utilizzando l'argomento' exact '.

Le chiamate di funzione sono, ovviamente, diverse. Vedere get("[.data.frame") contro get("[[.data.frame") contro get("$")

7

In questo caso, per la maggior parte degli usi, eviterei sub-setting del tutto e cercando di ricordare cosa $, [ e [[ fare con un frame di dati. Vorrei solo usare with():

> df <- data.frame(x = 1:20, y = letters[1:20], z = 20:1) 
> with(df, y) 
[1] a b c d e f g h i j k l m n o p q r s t 
Levels: a b c d e f g h i j k l m n o p q r s t 

che è molto più chiara rispetto a qualsiasi dei metodi di impostazione sub-in maggior parte dei casi (secondo me).

6

Una cosa che non ho visto spiegato esplicitamente è che [ e [[ può essere utilizzato per selezionare in base al valore di una variabile o un'espressione mentre $ non può. Vale a dire che si può fare:

> example_frame <- data.frame(Var1 = c(1,2), Var2 = c('a', 'b')) 
> x <- 'Var1' 

> example_frame$x 
NULL # Not what you wanted 

> example_frame[x] 
    Var1 
1 1 
2 2 

> example_frame[[x]] 
[1] 1 2 

> example_frame[[ paste(c("V","a","r",2), collapse='') ]] 
[1] a b 
Levels: a b 

Le differenze tra [ e [[ sono stati ben coperti da other posts e other questions.

+1

Stranamente, * 'example_frame $ 'Var1'' * funziona ancora *' example_frame $ x' * fallisce. – smci

Problemi correlati