我一直在寻找很多答案,但我仍然不能完全理解它们。例如,最清楚的一个(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
代码行中,它使用了点和~
符号。我知道~
的意思是“所有其他变量”,但是点是什么意思呢?它有另一种含义或用途吗?在一个特定的函数中,管道操作符是什么?
发布于 2019-02-22 04:29:46
这行代码以三种不同的方式使用.
。
[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]
上使用.
创建自定义函数
发布于 2019-02-22 04:44:45
由于有多个函数按顺序执行,因此可以选择使用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
https://stackoverflow.com/questions/54815607
复制相似问题