R 与点 (".")、 "~"和管道 (%>%) 运算符的组合

标签 r dplyr pipe magrittr

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

上面的代码来自 explanation for %>% in magrittr ,在那里我也试图理解管道运算符(我知道它为您提供了先前计算的结果,但是当它混合 aggregate. 时,我迷失在 %>% 代码行中相同的功能。

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

最佳答案

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

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

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

这只是因为 aggregate需要一个有左右手边的公式。所以.[1]只是表示“数据集中的所有其他列”。这种用法与 m​​agrittr 完全没有关系。
.[2]是作为管道传入的值。如果你有一个普通的 .作为函数的参数,值将被放置在那里。所以subset()的结果会去data=范围。
magrittr库还允许您使用 . 定义匿名函数。多变的。如果您有一个以 . 开头的链,它被视为一个函数。所以
. %>% mean %>% round(2)

是相同的
function(x) round(mean(x), 2)

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

关于R 与点 (".")、 "~"和管道 (%>%) 运算符的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815607/

相关文章:

r - 需要删除包含 "0"的单元格并保留 R 中的其他单元格

c - 通过管道函数在 C 中计算行列式矩阵。修订代码

Angular 管道引用 Assets

c - Fscanf 未使用 execl 通过管道的输出从通过 fdopen 分配的流中读取任何值

r - 跨多个列检测关键字并在新列中分别标记它们

从 VBA 运行 R 脚本

r - 无法修复 ggplot2 facet_wrap geom_histogram 图中的 x 轴标签

r - 从数据框中的前一列中减去每一列

r - 根据 R 中的列表列表更改列

r - 从R中的字符串中匹配提取的国家名称