2014-11-22 20 views
6

Sto imparando a utilizzare R (versione 3.1.2), quindi potrebbe trattarsi di una domanda noob, ma sto riscontrando problemi nell'ordinare un sottoinsieme di un frame di dati. Se utilizzo il data frame mtcars usando attach(mtcars), posso facilmente ordinarlo usando ord.cars <- mtcars[order(hp),]. Il problema è che, se uso un sottoinsieme, diciamo sub.cars <- subset(mtcars, hp > 120) e cercare di ordinare utilizzando ord.sub <- sub.cars[order(mpg),], il risultato è il seguente:Sottoinsieme di dati R ordinamento

     mpg cyl disp hp drat wt qsec vs am gear carb 
NA     NA NA NA NA NA NA NA NA NA NA NA 
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 
NA.1     NA NA NA NA NA NA NA NA NA NA NA 
NA.2     NA NA NA NA NA NA NA NA NA NA NA 
NA.3     NA NA NA NA NA NA NA NA NA NA NA 
NA.4     NA NA NA NA NA NA NA NA NA NA NA 
Merc 280   19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 
NA.5     NA NA NA NA NA NA NA NA NA NA NA 
Merc 450SL   17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 
NA.6     NA NA NA NA NA NA NA NA NA NA NA 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
Duster 360   14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 
Merc 280C   17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 
NA.7     NA NA NA NA NA NA NA NA NA NA NA 
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 
NA.8     NA NA NA NA NA NA NA NA NA NA NA 
NA.9     NA NA NA NA NA NA NA NA NA NA NA 
Merc 450SE   16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 
NA.10     NA NA NA NA NA NA NA NA NA NA NA 
NA.11     NA NA NA NA NA NA NA NA NA NA NA 
AMC Javelin   15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 
Camaro Z28   13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 
Ford Pantera L  15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 
Ferrari Dino  19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 
Maserati Bora  15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 
Merc 450SLC   15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 
NA.12     NA NA NA NA NA NA NA NA NA NA NA 
NA.13     NA NA NA NA NA NA NA NA NA NA NA 
NA.14     NA NA NA NA NA NA NA NA NA NA NA 

Perché R mettendo indietro come AN ​​tutte le righe che sono stati lasciati fuori dal sottoinsieme?

Grazie in anticipo!

+2

Sto indovinando che questo è un problema relativo al tuo uso di 'attach()' che non è raccomandato in R. Prova il seguente: scollega il set di dati e poi usa '[' e/o '$' e se ti piace 'with()' per settare i tuoi dati: 'detach (mtcars); ord.cars <- mtcars [ordine (mtcars $ hp),]; sub.cars <- sottoinsieme (mtcars, hp> 120); ord.sub <- sub.cars [order (sub.cars $ mpg),] '. Funziona come previsto? –

+0

@beginneR Si prega di postare che come risposta. – Thomas

+0

Roger che, @Thomas :) –

risposta

7

Questo è un problema relativo all'utilizzo di attach() che non è consigliato in R - proprio per questo motivo! Il problema è che il tuo codice è un po 'ambiguo o, per lo meno, è qualcosa di diverso da quello che ti aspettavi che fosse.

Come risolvere questo?

  1. detach il set di dati e
  2. non usano ancora attach. Invece, utilizzare [ e/o $ e se si desidera with() per impostare i propri dati.

Ecco come si potrebbe fare per l'esempio:

detach(mtcars) 
ord.cars <- mtcars[order(mtcars$hp),] 

sub.cars <- subset(mtcars, hp > 120) 
#the subset could also be written as: 
sub.cars <- mtcars[mtcars$hp > 120,] 

ord.sub <- sub.cars[order(sub.cars$mpg),] 

head(ord.sub) # only show the first 6 rows 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Cadillac Fleetwood 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4 
Lincoln Continental 10.4 8 460 215 3.00 5.42 17.8 0 0 3 4 
Camaro Z28   13.3 8 350 245 3.73 3.84 15.4 0 0 3 4 
Duster 360   14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 
Chrysler Imperial 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4 
Maserati Bora  15.0 8 301 335 3.54 3.57 14.6 0 1 5 8 

Che cosa ha causato il problema nel codice?

Dopo aver attached i dati mtcars, ogni volta che si chiama uno dei nomi di colonna dei dati allegati, come mpg, si farà riferimento al dataset allegato (i dati originali mtcats). Il problema allora era che hai sottotetto i dati e li hai memorizzati in un nuovo oggetto (sotto.cars) che non era collegato mentre mtcars era ancora collegato. Quindi, quando hai provato ad ordinare i dati sub.cars, hai utilizzato sub.cars[order(mpg),] e come puoi vedere, in questo caso, fai riferimento alla colonna , che è interpretata da R come quella del set di dati mtcars (originale) allegato, con più file di quanti non hai dati sottostanti. Tutte le righe nelle sottocartelle che sono state escluse dalla sottorete, verranno ora visualizzate come NA in sub.cars.

Lezione: non utilizzare attach().

+0

Grazie mille per il tuo tempo e la tua pazienza! – Tommy

Problemi correlati