Предположим, что я имею предосудительные отношения с некоторыми данными путем связывания векторов, поскольку я имею привычку делать в ленивое воскресенье днем.
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) ])
или что-то, но я не могу вполне выяснить, как сказать, "очистите все КРОМЕ следующих объектов".
Я бы подошел к этому, создав отдельную среду для хранения всех ненужных переменных, сделав ваш фрейм данных, используя 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"
и, конечно, вы можете избавиться от нежелательной среды, если действительно хотите.
Вот подход с использованием setdiff
:
rm(list=setdiff(ls(), "dd"))
Поскольку я забыл, что комментарии не поддерживают полное форматирование, я хотел ответить на рекомендацию Хэдли здесь. Часть моего существующего кода - возможно, небрежно - имеет тенденцию работать следующим образом:
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 ()
.
Я считаю, что такое поведение вполне ожидаемо, и ответ здесь заключается в том, что я придерживаюсь неоптимальной практики кодирования. Итак, как мне начать писать код, позволяющий избежать подобных непреднамеренных столкновений?