Как работают функции with() и within() в R

В этом руководстве мы посмотрим, как работают очень тесно связанные, но все же разные функции языка R – with() и within(). 

Функция with()

В программировании мы часто сталкиваемся с необходимостью создавать настраиваемые/определяемые пользователем функции для выполнения определенной операции. С помощью функции with() мы можем работать с выражениями R, а также вызывать необходимую функцию в рамках одной строки.

То есть функция with() позволяет нам оценить выражение R внутри функции, которая будет передана в качестве аргумента. Это работает только с фреймами данных. Вот почему результат оценки выражения R выполняется относительно фрейма данных, переданного ему в качестве аргумента.

Синтаксис данной функции имеет следующий вид: 

with(data-frame, R expression)

Давайте рассмотрим эту функцию на примере: 

rm(list = ls())

Num <- c(100,100,100,100,100)
Cost <- c(1200,1300,1400,1500,1600)

data_A <- data.frame(Num,Cost,stringsAsFactors = FALSE)

with(data_A, Num*Cost)
with(data_A, Cost/Num)

В приведенном выше примере мы вычислили выражение Num*Cost для фрейма данных data_A непосредственно в функции with().

После этого внутри функции мы также вычислили выражение Cost/Num.

Мы поставили эти два оператора один за другим, чтобы подчеркнуть, что функция with() никак не изменяет исходный фрейм данных. Она дает отдельный вывод для каждого значения, связанного со столбцами фрейма данных.

Мы получим такой результат: 

> with(data_A, Num*Cost)
[1] 120000 130000 140000 150000 160000
> with(data_A, Cost/Num)
[1] 12 13 14 15 16

Функция within()

Теперь, когда вы знаете, как работает функция with(), давайте сосредоточимся на ее “близнеце”. На самом деле, похожи у этих функций только названия, работают они по-разному.

Функция within() тоже вычисляет результат выражения внутри себя, но с небольшой разницей. Она позволяет создать копию фрейма данных и добавить столбец, в котором в конечном итоге будет храниться результат выражения R.

Ее синтаксис выглядит так: 

within(data frame, new-column <- R expression)

Посмотрим на пример использования этой функции: 

rm(list = ls())

Num <- c(100,100,100,100,100)
Cost <- c(1200,1300,1400,1500,1600)

data_A <- data.frame(Num,Cost,stringsAsFactors = FALSE)

within(data_A, Product <- Num*Cost)
within(data_A, Q <- Cost/Num)

Здесь мы выполнили вычисление тех же выражений, на примере которых рассматривали функцию with(). Но в данном случае мы еще и создали новый столбец для хранения результата выражения.

> within(data_A, Product <- Num*Cost)
  Num Cost Product
1 100 1200  120000
2 100 1300  130000
3 100 1400  140000
4 100 1500  150000
5 100 1600  160000
> within(data_A, Q <- Cost/Num)
  Num Cost  Q
1 100 1200 12
2 100 1300 13
3 100 1400 14
4 100 1500 15
5 100 1600 16

Читайте также: head() и tail() в R: подробный справочник

Tags:

Добавить комментарий