我一直在寻找很多答案,但我仍然无法完全理解它们。例如,最清晰的一个(here和其他一些{1,2,3)给出了有关点的各种用法的具体示例,但我不明白,例如,它在这里的应用:
header('Content-Type: application / json');
上面的代码来自explanation for %>% in magrittr,在这里我也试图理解管道运算符(我知道它为您提供了先前计算的结果,但是我迷失了{{1} }在同一函数中混合使用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
和aggregate
时的代码行。
所以,我不明白上面的代码是什么。我有结果(我放在上面)。但是我不知道它如何达到该结果,特别是.
代码行,它使用点和%>%
符号。我知道aggregate
的意思是“所有其他变量”,但是用点表示什么呢?它有其他含义或应用?以及在特定函数中的管道运算符是什么?
答案 0 :(得分:8)
该行以三种不同方式使用.
。
[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]
创建自定义函数
答案 1 :(得分:1)
在聚合语句中以三种方式使用点:
aggregate.formula 。formula
的{{1}}方法指定一个公式,其中〜的左侧(LHS)定义变量以应用〜右边的函数定义要分组的变量。它在公式中使用点表示未在公式中提及的所有其他变量。例如,使用具有列aggregate
,ToothGrowth
和len
的内置supp
数据帧,它们是相同的。我们按dose
分组,而supp
分别对mean
和len
起作用。
dose
管道的RHS 在管道的右侧(RHS)上使用magrittr使用点表示输入,即管道左侧的任何内容。因此,它们是相同的:
aggregate(. ~ supp, ToothGrowth, mean)
aggregate(cbind(len, dose) ~ supp, ToothGrowth, mean)
管道的LHS 在管道的左侧使用magrittr使用点表示函数定义。例如,这两个函数定义都定义了一个将其参数平方的函数:
4 %>% sqrt(.) # use of dot on RHS
sqrt(4)
也许最容易看出我们是否在没有点的问题中编写示例:
square1 <- . %>% .^2 # use of dot on LHS
square2 <- function(x) x^2
答案 2 :(得分:0)
由于有多个功能按顺序运行,因此可以选择使用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