2011-02-02 10 views
6

Ho un data.frame con una colonna, in questo modo:Data.frame diventa fattore/vettore dopo filtrazione/subsetting

>d = data.frame(animal=c("horse","dog","cat")) 

poi filtrare escludendo tutti gli elementi presenti anche in un vettore. ad esempio

> res = d[!(d$animal %in% c("horse")),] 
> res 
[1] dog cat 
Levels: cat dog horse 
>class(res) 
[1] "factor" 

Che cosa sta succedendo qui?

+0

Si noti inoltre che la classe della colonna il tuo data.frame non è "carattere", ma "fattore": 'classe (d [[1]])'. –

risposta

9

Benvenuti a R. Sei stato appena morso dal drop fastidio: è necessario indicare esplicitamente R non cadere "a one-dimensione":

res = d[!(d$animal %in% c("horse")), , drop = FALSE] 
+0

Cribbio. Chi ha pensato che fosse una buona idea? –

+0

Vedere R Inferno di Patrick Burns per una discussione più dettagliata su questo: http://lib.stat.cmu.edu/S/Spoetry/Tutor/R_inferno.pdf –

+1

È divertente, sto usando R per 3 o 4 anni e questa è la prima volta che mi imbatto in questo. Immagino che di solito non usi 1 data.frames di colonna. –