2010-05-12 10 views
10

Przypuśćmy, że mam problem z niektórymi danymi, wiążąc wektory razem, jak to mam robić w leniwe niedzielne popołudnie.Jak mogę dokładnie wyczyścić mój obszar roboczy R, zachowując określone obiekty?

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) 

Ja teraz mam moją nową dataframe dd, co jest wspaniałe. Ale jest też wciąż detrytusu z moich wcześniejszych slicings i dicings:

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

Co znajduje się w prosty sposób, aby oczyścić moje miejsce pracy, jeśli nie trzeba już moje kolumny „źródło”, ale chcę zachować dataframe? Oznacza to, że teraz Skończyłem manipulowania danymi Chciałbym tylko mieć dd i żaden z mniejszych zmiennych, które mogą przypadkowo maskują dalszej analizy:

> ls() 
    [1] "dd" 

Czuję, że rozwiązanie musi mieć postać rm(ls[ -(dd) ]) lub coś w tym stylu, ale nie wiem, jak powiedzieć "proszę posprzątać wszystko, ALE następujące obiekty."

Odpowiedz

9

Podejdę do tego, tworząc oddzielne środowisko do przechowywania wszystkich zmiennych śmieciowych, tworząc ramkę danych za pomocą with(), a następnie kopiując te, które chcesz zachować w głównym środowisku. Ma to tę zaletę, że jest uporządkowana, ale także zachowuje wszystkie swoje obiekty na wypadek, gdybyś chciał ponownie na nie spojrzeć.

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) 

To daje:

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

i oczywiście można pozbyć się śmieci środowisko, jeśli naprawdę chcesz.

+3

Lub użyj 'local' jak' dd <- local ({x <-....; data.frame (msscore = x, ...)}) 'i nie ma' temp'. 'local' zwraca ostatnie wyrażenie, więc ostatni wiersz powinien zwrócić' dd'. – Marek

11

Oto podejście używając setdiff:

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

@rcs - to całkiem sprytne. Czy mój problem jest powszechny w czyszczeniu danych? Wyobraziłem sobie, że tak musi być, ale może dlatego, że jestem nowicjuszem. Czy to dziwne, że masz interaktywny kawałek krojonej kości, a następnie trzeba wyczyścić bity, które nie są już potrzebne? – briandk

+0

Uważam, że to bardzo często, lubię mieć wykończenia obszaru roboczego – Dan

+3

Nigdy nie używam 'rm'. Zwykle nie ma znaczenia, że ​​masz kilka tymczasowych elementów leżących w pobliżu - jeśli dzieje się to często, prawdopodobnie jest to znak, że powinieneś stworzyć funkcję. – hadley

0

Odkąd pamiętam, że komentarze nie obsługują pełne formatowanie, chciałem odpowiedzieć na zalecenia Hadley tutaj. Niektóre z mojego istniejącego kodu - może niechlujnie - ma tendencję do pracy tak:

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 

W powyższym kodzie, qplot() będzie wykreślić 25 punktów, i myślę, że to dlatego, że moje zmienne globalne caseid i height są maskowania jego próbę aby uzyskać do nich lokalny dostęp z dostarczonej ramki danych. Tak więc sprawa, którą usunąłem, wydaje się być narysowana, ponieważ pojawia się w zmiennych globalnych, ale nie w ramce danych hd w czasie wywołania qplot().

Mam wrażenie, że to zachowanie jest całkowicie oczekiwane, i że tutaj odpowiedź brzmi, że podążam za nieoptymalną praktyką kodowania. Jak więc zacząć pisać kod, który pozwala uniknąć takich nieumyślnych kolizji?

+0

Hmm ... ja nie myślę, że to właśnie się dzieje, na przykład stworzyłem hd2, który miał tylko dziesięć wierszy z hd. Jeśli globalny caseid i height maskowałyby w qplot(), nie ma znaczenia, jaki ma argument danych, prawda? Zdecydowanie dostaniesz 10 punktów za pomocą hd2 –

+0

1. Czy jesteś pewien, że liczysz poprawnie? –

+0

2. Jeśli robisz case i height jawnie, aby przejść do data.frame i nigdy nie potrzebujesz ich jako własnych wektorów, możesz zrobić 'hd <- data.frame (caseid = 1:25, wysokość = rnorm (25, średnia = 150, sd = 15))'. –

Powiązane problemy