带点(“。”),“〜”和管道(%>%)运算符的R组合

时间:2019-02-21 20:21:04

标签: r dplyr pipe magrittr

我一直在寻找很多答案,但我仍然无法完全理解它们。例如,最清晰的一个(here和其他一些{123)给出了有关点的各种用法的具体示例,但我不明白,例如,它在这里的应用:

header('Content-Type: application / json');

上面的代码来自explanation for %>% in magrittr,在这里我也试图理解管道运算符(我知道它为您提供了先前计算的结果,但是我迷失了{{1} }在同一函数中混合使用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 aggregate时的代码行。

所以,我不明白上面的代码是什么。我有结果(我放在上面)。但是我不知道它如何达到该结果,特别是.代码行,它使用点和%>%符号。我知道aggregate的意思是“所有其他变量”,但是用点表示什么呢?它有其他含义或应用?以及在特定函数中的管道运算符是什么?

3 个答案:

答案 0 :(得分:8)

该行以三种不同方式使用.

         [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]创建自定义函数

答案 1 :(得分:1)

在聚合语句中以三种方式使用点:

  • aggregate.formula formula的{​​{1}}方法指定一个公式,其中〜的左侧(LHS)定义变量以应用〜右边的函数定义要分组的变量。它在公式中使用点表示未在公式中提及的所有其他变量。例如,使用具有列aggregateToothGrowthlen的内置supp数据帧,它们是相同的。我们按dose分组,而supp分别对meanlen起作用。

    dose
  • 管道的RHS 在管道的右侧(RHS)上使用magrittr使用点表示输入,即管道左侧的任何内容。因此,它们是相同的:

    aggregate(. ~ supp, ToothGrowth, mean)
    aggregate(cbind(len, dose) ~ supp, ToothGrowth, mean)
    
  • 管道的LHS 在管道的左侧使用magrittr使用点表示函数定义。例如,这两个函数定义都定义了一个将其参数平方的函数:

    4 %>% sqrt(.) # use of dot on RHS
    sqrt(4)
    

也许最容易看出我们是否在没有点的问题中编写示例:

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

答案 2 :(得分:0)

由于有多个功能按顺序运行,因此可以选择使用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