Да предположим, че се забърквам с някои данни, като свързвам вектори заедно, както обичам да правя на мързелив неделен следобед.
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
, което е чудесно. Но все още има и детрит от моите предишни срезове:
> ls()
[1] "dd" "x" "y" "z"
Какъв е простият начин да изчистим работното си пространство, ако вече не се нуждая от колоните "източник", но искам да запазя рамката? dd
и нито една от по-малките променливи, които неволно биха маскирали по-нататъшен анализ:
> ls()
[1] "dd"
Чувствам, че решението трябва да е във формата rm(ls[ -(dd) ])
или нещо, но не мога да разбера как да кажа "моля, почистете всичко, но следните обекти."
Отговори:
9 за отговор № 1Бих подходил към това, като направих отделна среда, в която да съхранявам всички нежелани променливи, като използвам вашия кадър с данни with()
, след това копирате онези, които искате да запазите в основната среда. Това има предимството да бъде подредено, но и да държи всичките си обекти наоколо в случай, че искате да ги видите отново.
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)
Това ви дава:
> ls()
[1] "dd" "temp"
> with(temp,ls())
[1] "dd" "x" "y" "z"
и разбира се можете да се отървете от нежеланата среда, ако наистина искате.
11 за отговор № 2
Ето един подход, използващ setdiff
:
rm(list=setdiff(ls(), "dd"))
0 за отговор № 3
Тъй като забравих, че коментарите не подкрепят пълното форматиране, исках да отговоря на препоръката на Хадли тук. Някои от съществуващия ми код - може би небрежно - са склонни да работят по следния начин:
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
В горния код, qplot()
ще начертае 25 точки и мисля, че това е защото моите глобални променливи caseid
и height
маскират опита за достъп до тях локално от предоставената рамка за данни. Така че случаят, който изтрих, все още изглежда да се начертае, защото се появява в глобалните променливи, макар и не в рамката на данните hd
по време на qplot()
обадете се.
Смисълът ми е, че това поведение е изцялоочаквам, и че отговорът тук е, че следвам една неоптимална практика за кодиране.