我一直在寻找很多答案,但我仍然无法完全理解它们。例如,最清晰的( 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
和 .
时,我迷失在 %>%
代码行中相同的功能。所以,我无法理解上面的代码是什么。我有结果(我把它放在上面)。但我不明白它是如何达到这个结果的,特别是
aggregate
代码行,它使用了点和 ~
符号。我知道 ~
的意思是“所有其他变量”,但它的点是什么意思?它还有其他意义或应用吗?特定函数中的管道运算符是什么?
最佳答案
该行使用 .
以三种不同的方式。
[1] [2] [3]
aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2))
一般来说,您可以使用
.
将管道中的值传递到特定位置的函数中。但也有一些异常(exception)。一个异常(exception)是当 .
是在一个公式中。 ~
用于在 R 中创建公式。管道不会改变公式的含义,因此它的行为就像没有任何转义一样。例如aggregate(. ~ cyl, data=mydata)
这只是因为
aggregate
需要一个有左右手边的公式。所以.
在 [1]
只是表示“数据集中的所有其他列”。这种用法与 magrittr 完全没有关系。.
在 [2]
是作为管道传入的值。如果你有一个普通的 .
作为函数的参数,值将被放置在那里。所以subset()
的结果会去data=
范围。magrittr
库还允许您使用 .
定义匿名函数。多变的。如果您有一个以 .
开头的链,它被视为一个函数。所以. %>% mean %>% round(2)
是相同的
function(x) round(mean(x), 2)
所以你只是用
.
创建一个自定义函数在 [3]
关于R 与点 (".")、 "~"和管道 (%>%) 运算符的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815607/