#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