【问题标题】:R combinations with dot ("."), "~", and pipe (%>%) operatorR 与点 (".")、"~" 和管道 (%>%) 运算符的组合
【发布时间】:2019-07-15 20:53:24
【问题描述】:

我一直在寻找很多答案,但我仍然无法完全理解它们。例如,最清晰的(here),以及其他(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

上面的代码来自explanation for %>% in magrittr,我也在尝试理解管道运算符(我知道它给了你之前计算的结果,但是我在aggregate 代码行中迷路了它将.%&gt;% 混合在同一个函数中。

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

【问题讨论】:

  • 我认为这里令人困惑的是.aggregate 调用的公式中的不同用法以及它在magrittr 包中的用法。每?formula:“在公式中有两种特殊的解释。通常的解释是在模型拟合函数的数据参数的上下文中,意思是'公式中没有的所有列':见terms.formula。在update.formula 的上下文,只是,它的意思是'以前在这部分公式中的内容'。"

标签: r dplyr pipe magrittr


【解决方案1】:

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

  • aggregate.formula aggregateformula 方法指定了一个公式,其中 ~ 的左侧 (LHS) 定义要应用函数的变量,右侧定义~ 定义分组依据的变量。它在公式中使用点来表示公式中未提及的所有其他变量。例如,使用具有列lensuppdose 的内置ToothGrowth 数据框是相同的。我们按supp 分组,而mean 作用于lendose 中的每一个。

    aggregate(. ~ supp, ToothGrowth, mean)
    aggregate(cbind(len, dose) ~ supp, ToothGrowth, mean)
    
  • RHS of pipe 当用于管道右侧 (RHS) 时,magrittr 使用点来表示输入,即管道左侧的任何内容。因此,它们是相同的:

    4 %>% sqrt(.) # use of dot on RHS
    sqrt(4)
    
  • LHS of pipe 在管道左侧使用时 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.

【讨论】:

    【解决方案2】:

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

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

    一般来说,您使用. 将管道中的值传递到特定位置的函数中,但也有一些例外。一个例外是. 在公式中。 ~ 用于在 R 中创建公式。管道不会改变公式的含义,因此它的行为就像没有任何转义一样。例如

    aggregate(. ~ cyl, data=mydata)
    

    这只是因为aggregate 需要一个左右两边的公式。因此,[1] 上的 . 仅表示“数据集中的所有其他列”。这种用法与 m​​agrittr 完全无关。

    [2] 处的 . 是作为管道传入的值。如果您有一个普通的. 作为函数的参数,那么将在那里放置值。所以subset() 的结果会转到data= 参数。

    magrittr 库还允许您使用. 变量定义匿名函数。如果您有一个以. 开头的链,则它被视为一个函数。所以

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

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

    所以您只是使用. [3] 创建一个自定义函数

    【讨论】:

      【解决方案3】:

      由于有多个函数以顺序方式起作用,因此可以选择使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-30
        • 2022-06-29
        • 1970-01-01
        • 2018-04-28
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        相关资源
        最近更新 更多