2010-05-12 7 views
10

Supongamos que estoy jugando con algunos datos vinculando vectores juntos, como lo haré en un perezoso domingo por la tarde.¿Cómo puedo limpiar limpiamente mi área de trabajo R conservando ciertos objetos?

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) 

ahora tengo mi nueva trama de datos dd, que es maravilloso. Pero también hay todavía los restos de mis cortes en láminas y dicings anteriores:

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

¿Qué es una forma sencilla de limpiar mi espacio de trabajo si ya no necesita mis columnas "fuente", pero yo quiero seguir la trama de datos? Es decir, ahora que he terminado de manipular los datos que me gustaría ir a tomar dd y ninguna de las variables más pequeños que podrían enmascarar inadvertidamente un análisis más detallado:

> ls() 
    [1] "dd" 

Siento que la solución debe ser de la forma rm(ls[ -(dd) ]) o algo así, pero no puedo entender cómo decir "por favor, limpia todo, PERO los siguientes objetos".

Respuesta

9

Me acercaría a esto haciendo un entorno separado en el que almacenar todas las variables basura, haciendo que su marco de datos use with(), y luego copie los que desea mantener en el entorno principal. Esto tiene la ventaja de ser ordenado, pero también guarda todos tus objetos en caso de que quieras volver a mirarlos.

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) 

Esto le da:

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

y por supuesto usted puede deshacerse del medio ambiente no deseado si realmente quiere.

+3

O use 'local' como' dd <- local ({x <-....; data.frame (msscore = x, ...)}) 'y no hay' temp'. 'local' devuelve la última expresión, por lo que la última línea debe devolver' dd'. – Marek

11

Aquí es un método que utiliza setdiff:

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

@rcs - eso es bastante ingenioso. ¿Es mi problema algo común en la limpieza de datos? Me imaginaba que tenía que ser así, pero tal vez es porque soy un novato. ¿Es raro tener un poco interactivo de slice n dados, seguido de la necesidad de limpiar los bits que ya no son necesarios? – briandk

+0

me parece que para ser muy común, me gusta tener un área de trabajo de recorte – Dan

+3

Nunca uso 'rm'. Por lo general, no importa que tenga algunas piezas provisionales por ahí, si está sucediendo mucho, es probable que sea una señal de que debe crear una función. – hadley

0

Desde olvidé que los comentarios no son compatibles con el formato completo, quería responder a la recomendación de Hadley aquí. Algunos de mi código existente - quizás descuidada - tiende a funcionar así:

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 

En el código anterior, se qplot() trazar 25 puntos, y yo creo que es porque mis variables globales caseid y height enmascaran su intento para acceder a ellos localmente desde el marco de datos provisto. Por lo tanto, el caso que eliminé todavía parece trazarse, porque aparece en las variables globales, aunque no en el marco de datos hd en el momento de la llamada qplot().

Mi sensación es que este comportamiento es completamente esperado, y que la respuesta aquí es que estoy siguiendo una práctica de codificación subóptima. Entonces, ¿cómo puedo comenzar a escribir código que evite este tipo de colisiones inadvertidas?

+0

Hmm ... no lo hago Creo que eso es lo que está pasando. Por ejemplo, hice un hd2 que solo tenía diez filas de hd. Si el caseid global y la altura estuvieran enmascarados en el qplot(), no importaría lo que tome el argumento de datos, ¿verdad? definitivamente obtenga 10 puntos con hd2. –

+0

1. ¿Está SEGURO de que está contando correctamente? –

+0

2. Si está creando caseid y height explícitamente para entrar en el data.frame y nunca los necesita como sus propios vectores, puede hacer 'hd <- data.frame (caseid = 1:25, height = rnorm (25, mean = 150, sd = 15))'. –

Cuestiones relacionadas