2010-05-12 11 views
10

Supponiamo che io sto armeggiare con alcuni dati di vettori vincolanti insieme, come sono abituato a fare su un pigro pomeriggio di domenica.Come posso pulire ordinatamente il mio spazio di lavoro R preservando determinati oggetti?

x <- rnorm(25, mean = 65, sd = 10) 
    y <- rnorm(25, mean = 75, sd = 7) 
    z <- 1:25 

    dd <- data.frame(mscore = x, vscore = y, caseid = z) 

ora ho il mio nuovo dataframe dd, che è meraviglioso. Ma c'è anche ancora i detriti dai miei affettamento e dicings precedenti:

> ls() 
    [1] "dd"  "x"   "y"   "z"   

Che cosa è un modo semplice per ripulire il mio lavoro se non ho più bisogno di miei articoli "source", ma voglio mantenere la dataframe? Cioè, adesso che ho finito la manipolazione dei dati mi piacerebbe avere solo dd e nessuna delle variabili più piccole che potrebbero inavvertitamente mascherare ulteriori analisi:

> ls() 
    [1] "dd" 

mi sento come la soluzione deve essere di forma rm(ls[ -(dd) ]) o qualcosa del genere, ma non riesco a capire come dire "per favore ripulisci tutto, MA i seguenti oggetti".

risposta

9

Mi avvicinerei a questo creando un ambiente separato in cui memorizzare tutte le variabili spazzatura, creando il frame dati utilizzando with(), quindi copiando quelli che si desidera mantenere nell'ambiente principale. Questo ha il vantaggio di essere ordinato, ma anche di tenere tutti gli oggetti in giro nel caso in cui si desideri guardarli di nuovo.

temp <- new.env() 
with(temp, { 
    x <- rnorm(25, mean = 65, sd = 10) 
    y <- rnorm(25, mean = 75, sd = 7) 
    z <- 1:25 
    dd <- data.frame(mscore = x, vscore = y, caseid = z) 
    } 
) 

dd <- with(temp,dd) 

Questo vi dà:

> ls() 
[1] "dd" "temp" 
> with(temp,ls()) 
[1] "dd" "x" "y" "z" 

e, naturalmente, si può sbarazzarsi dell'ambiente spazzatura se si vuole veramente.

+3

Oppure usa 'local' come' dd <- local ({x <-....; data.frame (msscore = x, ...)}) 'e non c'è' temp'. 'local' restituisce l'ultima espressione quindi l'ultima riga dovrebbe restituire' dd'. – Marek

11

Ecco un approccio usando setdiff:

rm(list=setdiff(ls(), "dd")) 
+0

@rcs - che è abbastanza intelligente. Il mio problema è qualcosa di comune nella pulizia dei dati? Ho immaginato che doveva essere, ma forse è perché sono un novizio. È strano avere un bit interattivo di dadi di slice n, seguito dalla necessità di ripulire i bit che non sono più necessari? – briandk

+0

Trovo che per essere molto comune, mi piace avere uno spazio di lavoro assetto – Dan

+3

Io non uso mai 'rm'. Di solito non importa che tu abbia alcuni pezzi provvisori in giro - se sta succedendo molto, probabilmente è un segno che devi creare una funzione. – hadley

0

Da quando ho dimenticato che i commenti non supportano la formattazione completa, ho voluto rispondere alle raccomandazioni del Hadley qui. Alcuni del mio codice esistente - forse spiccia - tende a lavorare in questo modo:

caseid <- 1:25 
    height <- rnorm(25, mean = 150, sd = 15) 
    hd  <- data.frame(caseid, height) 
    hd  <- hd [-(7), ] # Removing a case 
    library(ggplot2) 
    qplot(x = caseid, y = height, data = hd) # Plots 25 points 

Nel codice di cui sopra, sarà qplot() tracciare 25 punti, e penso che sia perché le mie variabili globali caseid e height sono mascherando il suo tentativo per accedervi localmente dal dataframe fornito. Così, il caso che ho rimosso sembra ancora ottenere tracciati, perché appare nelle variabili globali, anche se non la dataframe hd al momento della chiamata qplot().

mia sensazione è che questo comportamento è del tutto previsto, e che la risposta è che sto seguendo una prassi di codifica non ottimale. Quindi, come posso iniziare a scrivere codice che eviti questo tipo di collisioni involontarie?

+0

Hmm ... Io non Penso che sia quello che sta succedendo, ad esempio, ho realizzato un hd2 con dieci righe solo da hd, se il caseid globale e l'altezza fossero mascherati nel qplot(), non avrebbe importanza l'argomento dei dati, giusto? Ottieni sicuramente 10 punti con hd2 –

+0

1. SEI SICURO stai contando correttamente? –

+0

2. Se stai facendo caseid e altezza esplicitamente per entrare nel data.frame e non hai mai bisogno di loro come i loro vettori, puoi fare 'hd <- data.frame (caseid = 1:25, height = rnorm (25, mean = 150, sd = 15))'. –

Problemi correlati