2015-08-05 12 views
10

Non uso indicizzazione data.frame per nome riga molto spesso, ma a volte è vantaggioso farlo. Tuttavia ho notato risultato imprevisto quando ho provato a filtrare fila poco emozionanteComportamento imprevisto nell'indicizzazione data.frame per nome della riga

test <- data.frame(a = c("a", "b", "c"), 
        b = c("A", "B", "C"), 
        row.names = c(-99.5, 99.5, 99)) 
    test["-99", ] 

Ci si potrebbe aspettare che vi darà

 a b 
NA <NA> <NA> 

ma restituisce

 a b 
-99.5 a A 

Giusto per essere specifica

Session info --------------------------------------------------------------- 
setting value      
version R version 3.2.1 (2015-06-18) 
system x86_64, mingw32    
ui  RStudio (0.99.441)   
language (EN)       
collate English_United Kingdom.1252 
tz  Europe/London 

Qualche idea?

+0

probabilmente qualche meccanismo fuzzy matching già utilizzato quando si chiama una funzione. –

+0

Cosa intendi? Non c'è nessuna funzione qui. Questo bug sull'ambiente vuoto. – kismsu

+0

Questo è un ottimo esempio del perché si dovrebbero sempre usare le condizioni logiche per il subaffitto/l'indicizzazione. VERO o FALSO è ridicolmente più affidabile e intuitivo dei riferimenti nominali. Inoltre, tende ad essere più facile da eseguire il debug. –

risposta

6

Questo è davvero inaspettato.

La risposta a questa risiede nella corrispondenza parziale di nomi di fila per l'indicizzazione:

mtcars["Val", ] 

ci darà la riga "Valient". Questo non funzionerà per le colonne:

mtcars[ ,"cy"] 

per eliminare questo, mi piacerebbe sottoinsieme utilizzando:

subset(test, rownames(test) == "-99") 

Edit: è infatti documentato in ?"[.data.frame"

Entrambi [e [[estrazione i metodi corrispondono parzialmente ai nomi delle righe. Per impostazione predefinita, non corrisponde in parte ai nomi delle colonne, ma [[sarà se esatto = FALSE (e con un avviso se esatto = NA). Se si desidera eseguire la corrispondenza esatta sui nomi di riga utilizzare la corrispondenza, come negli esempi.

Per utilizzare partita sul vostro dati:

test[match("-99", row.names(test)), ] 
+1

Ora mi rendo conto di aver letto la domanda sbagliata. Buona risposta (+1). – Jaap

Problemi correlati