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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

我一直在寻找很多答案,但我仍然无法完全理解它们。例如,最明显的一个,其中包括(123)给出了具体的实例对点的各种用途,但我不能在这里理解,例如,它的应用:

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代码行,它使用点和~符号。我知道这~意味着“所有其他变量”,但它对点的意义是什么?它有另一种含义或应用吗?管道操作员在特定功能中的作用是什么?

提问于
用户回答回答于

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

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

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

aggregate(. ~ cyl, data=mydata)

这只是因为aggregate需要左右两侧的公式。因此,.[1]仅仅意味着“数据集中的所有其他列。” 这种用法与magrittr完全无关。

.[2]是真实传递中作为管的值。如果你有一个plain .作为函数的参数,那就是那里的值。因此,结果subset()将转到data=参数。

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

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

是相同的

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

所以你只是用.at 创建一个自定义函数[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

所属标签

可能回答问题的人

  • 天使的炫翼

    16 粉丝531 提问35 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券