R комбинации с оператором точка ("."), "~" И труба (%>%) - PullRequest
0 голосов
/ 21 февраля 2019

Я искал много ответов и до сих пор не могу до конца понять их.Например, самый чистый ( здесь ), среди прочих ( 1 , 2 , 3 ) приводит конкретные примеры различных применений.точки, но я не могу понять, например, ее применение здесь:

car_data <- 
  mtcars %>%
  subset(hp > 100) %>%
  aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2)) %>%
  transform(kpl = mpg %>% multiply_by(0.4251)) %>%
  print

#result:
  cyl   mpg  disp    hp drat   wt  qsec   vs   am gear carb    kpl
1   4 25.90 108.0 111.0 3.94 2.15 17.75 1.00 1.00 4.50 2.00 11.010
2   6 19.74 183.3 122.3 3.59 3.12 17.98 0.57 0.43 3.86 3.43  8.391
3   8 15.10 353.1 209.2 3.23 4.00 16.77 0.00 0.14 3.29 3.50  6.419

Код выше взят из объяснения %>% в magrittr , где я пытаюсьтакже понимаю оператор канала (я знаю, что он дает вам результат предыдущих вычислений, но я теряюсь в строке кода aggregate, когда он смешивает . и %>% внутри одной и той же функции.

Итак, я не могу понять, что означает приведенный выше код. У меня есть результат (я поставил его выше). Но я не понимаю, как он достигает этого результата, особенно строка кода aggregate, где он используетточка и знак ~. Я знаю, что ~ означает «все остальные переменные», но что это означает с точкой? Это имеет другое значение или применение? И что означает оператор канала внутри определенной функции?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Поскольку существует несколько функций, действующих последовательно, можно использовать compose

library(tidyverse)
f1 <- list(mean,  partial(round, digits = 2))
mtcars %>% 
    filter(hp > 100) %>% 
    group_by(cyl) %>% 
    summarise_all(list(~lift(compose)(f1)(.))) %>% 
    mutate(kpl = mpg * 0.4251) #multiply_by is a bit verbose
0 голосов
/ 21 февраля 2019

Точка используется в агрегированном выражении тремя способами:

  • aggregate.formula метод formula для aggregate определяет формулу, в которойЛевая часть (LHS) ~ определяет переменные, к которым применяется функция, а правая часть ~ определяет переменные для группировки.Он использует точку в формуле для обозначения всех других переменных, которые еще не упомянуты в формуле.Например, при использовании встроенного фрейма данных ToothGrowth, имеющего столбцы len, supp и dose, они совпадают.Мы группируем по supp, тогда как mean действует на каждый из len и dose.

    aggregate(. ~ supp, ToothGrowth, mean)
    aggregate(cbind(len, dose) ~ supp, ToothGrowth, mean)
    
  • RHS трубы при использовании направая сторона (RHS) трубы magrittr использует точку для представления ввода, то есть все, что находится на левой стороне трубы.Таким образом, они одинаковы:

    4 %>% sqrt(.) # use of dot on RHS
    sqrt(4)
    
  • LHS трубы при использовании с левой стороны трубы magrittr использует точку для представления определения функции.Например, эти два определения функции оба определяют функцию, которая возводит в квадрат ее аргумент:

    square1 <- . %>% .^2 # use of dot on LHS
    square2 <- function(x) x^2
    

Возможно, проще всего будет увидеть, если мы напишем пример в вопросе без точки:

mtcars0 <-  mtcars %>%
  subset(hp > 100)

aggregate(
  cbind(mpg,disp,hp,drat,wt,qsec,vs,am,gear,carb) ~ cyl,  # cbind(...) in place of .
  data = mtcars0, # mtcars0 in place of .
  FUN = function(x) round(mean(x), 2)) # instead of . %>% etc.
0 голосов
/ 21 февраля 2019

Эта строка использует . тремя различными способами.

         [1]             [2]      [3]
aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2))

Вообще говоря, вы передаете значение из конвейера в вашу функцию в определенном месте с ., но есть некоторые исключения,Единственным исключением является случай, когда . находится в формуле.~ используется для создания формул в R. Трубка не изменит смысла формулы, поэтому она ведет себя так, как если бы она не выходила.Например,

aggregate(. ~ cyl, data=mydata)

И это только потому, что aggregate требует формулы как с левой, так и с правой стороны.Таким образом, . в [1] просто означает «все остальные столбцы в наборе данных».Это использование никак не связано с magrittr.

. в [2] - это значение, которое передается в качестве канала.Если у вас есть простой . в качестве параметра функции, то там будет помещено значение.Таким образом, результат subset() перейдет к параметру data=.

Библиотека magrittr также позволяет вам определять анонимные функции с помощью переменной ..Если у вас есть цепочка, которая начинается с ., она рассматривается как функция.поэтому

. %>% mean %>% round(2)

совпадает с

function(x) round(mean(x), 2)

, поэтому вы просто создаете пользовательскую функцию с . при [3]

...