Можно ли использовать результаты блока with () вне блока?

#r

#r

Вопрос:

У меня есть масса средств, которые я хочу вычислить для набора данных с длинными именами переменных и уровнями. Поскольку прикрепление не одобряется, мне интересно, могу ли я использовать with() блок, но чтобы результаты были доступны после закрытия блока.

Вот пример инструкций, которые я задаю, но которые выполняются с $ соединителями. Уровни ртути в озерах различных типов в штате Мэн:

 Y_O=mean(Maine$Mercury[Maine$Lake_Type=="Oligotropic"])
Y_M=mean(Maine$Mercury[Maine$Lake_Type=="Mesotropic"])
Y_E=mean(Maine$Mercury[Maine$Lake_Type=="Eutropic"])
  

Читателям трудно понять, о чем я говорю.

Я бы хотел сделать это:

 with(Maine, {
  YGrand <- mean(Mercury)
  Y_O <- mean(Mercury[Lake_Type == "Oligotropic"])
  Y_M <- mean(Mercury[Lake_Type == "Mesotropic"])
  Y_E <- mean(Mercury[Lake_Type == "Eutropic"])
})
  

Я уже превысил лимит страниц для этой главы, поэтому у меня нет места для представления каналов. В глубине души я, кажется, припоминаю, что кто-то использовал другой оператор помимо <- в назначениях, которые повышали результаты до уровня обычного пользователя. Существует ли такая вещь?

Комментарии:

1. Вы пробовали запускать этот код? Что происходит? Вы можете попробовать, <<- а не <- . Я знаю, что это используется, когда вы находитесь внутри *apply() функций.

2. Рассматривали ли вы возможность сохранения в списке и последующего доступа к объектам из списка? Список обеспечивает гибкость для хранения в нем различных классов объектов.

3. Вы действительно хотите использовать их как отдельные переменные? Не очень хорошо масштабируется … даже с еще парой типов озер это быстро устарело бы. Я бы использовал tapply или aggregate . Y = with(Maine, tapply(Mercury, Lake_Type, mean)) работает хорошо и выдает именованный вектор, затем вы можете выполнить, например, Y["Oligotropic"] .

4. Спасибо всем. Отличные ответы!

5. @CephBirk : Это <<- то, о чем я думал. Полные баллы в вашу пользу.

Ответ №1:

Используется aggregate для применения функции к группам, определенным элементами в списке:

 > aggregate(mtcars$hp, list(cyl = mtcars$cyl) ,mean)
  cyl         x
1   4  82.63636
2   6 122.28571
3   8 209.21429
  

Ответ №2:

Могло бы сработать что-то вроде приведенного ниже, но я бы нашел альтернативный подход

 x = with(mtcars, {
    c_all = mean(mpg)
    c_6 = mean(mpg[cyl == 6])
    c_4 = mean(mpg[cyl == 4])
    c_8 = mean(mpg[cyl == 8])
    data.frame(c_all, c_4, c_6, c_8)
})
list2env(x, envir = .GlobalEnv)

c_4
#[1] 26.66364
c_6
#[1] 19.74286
c_8
#[1] 15.1
c_all
#[1] 20.09062