dplyr 句号字符“。”是啥意思?参考?
Posted
技术标签:
【中文标题】dplyr 句号字符“。”是啥意思?参考?【英文标题】:What does the dplyr period character "." reference?dplyr 句号字符“。”是什么意思?参考? 【发布时间】:2016-05-18 06:45:39 【问题描述】:以下 dplyr 代码中的句点 .
引用了什么?:
(df <- as.data.frame(matrix(rep(1:5, 5), ncol=5)))
# V1 V2 V3 V4 V5
# 1 1 1 1 1 1
# 2 2 2 2 2 2
# 3 3 3 3 3 3
# 4 4 4 4 4 4
# 5 5 5 5 5 5
dplyr::mutate_each(df, funs(. == 5))
# V1 V2 V3 V4 V5
# 1 FALSE FALSE FALSE FALSE FALSE
# 2 FALSE FALSE FALSE FALSE FALSE
# 3 FALSE FALSE FALSE FALSE FALSE
# 4 FALSE FALSE FALSE FALSE FALSE
# 5 TRUE TRUE TRUE TRUE TRUE
这是“所有列”的简写吗?这是 .
特定的 dplyr 语法还是一般的 R 语法(如 here 所讨论的)?
还有,为什么下面的代码会报错?
dplyr::filter(df, . == 5)
# Error: object '.' not found
【问题讨论】:
【参考方案1】:点在 dplyr 中主要(非唯一)在mutate_each
、summarise_each
和do
中使用。在前两个(以及它们的 SE 对应项)中,它指的是应用了 funs
中的函数的所有列。在do
中,它指的是(可能分组的)data.frame,因此您可以通过使用.$xyz
引用名为“xyz”的列来引用单个列。
无法运行的原因
filter(df, . == 5)
是因为 a) filter
并非设计用于处理多个列,例如 mutate_each
,b) 您需要使用管道运算符 %>%
(最初来自 magrittr
)。
但是,当与管道运算符 %>%
结合使用时,您可以将其与 rowSums
内的 filter
之类的函数一起使用:
> filter(mtcars, rowSums(. > 5) > 4)
Error: Objekt '.' not found
> mtcars %>% filter(rowSums(. > 5) > 4) %>% head()
lm cyl disp hp drat wt qsec vs am gear carb
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
4 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
5 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
6 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
您还应该查看 magrittr 帮助文件:
library(magrittr)
help("%>%")
从帮助页面:
将 lhs 放置在 rhs 调用中的其他位置 通常你会希望 lhs 在另一个位置而不是第一个位置上调用 rhs。为此,您可以使用点 (.) 作为占位符。例如,
y %>% f(x, .)
等价于f(x, y)
,z %>% f(x, y, arg = .)
等价于f(x, y, arg = z)
。将圆点用于次要目的 通常,除了 lhs 本身的值之外,在 rhs 调用中还需要 lhs 的某些属性或属性,例如行数或列数。在 rhs 调用中多次使用点占位符是完全有效的,但这是设计使然 在嵌套中使用时行为略有不同 函数调用。特别是,如果占位符仅用于 嵌套函数调用,lhs 也将作为第一个参数! 这样做的原因是,在大多数用例中,这会产生最多 可读的代码。例如,
iris %>% subset(1:nrow(.) %% 2 == 0)
是 相当于iris %>% subset(., 1:nrow(.) %% 2 == 0)
,但稍微 更紧凑。可以通过封闭来推翻这种行为 大括号中的 rhs。例如,1:10 %>% c(min(.), max(.))
是 相当于c(min(1:10), max(1:10))
。
【讨论】:
【参考方案2】:点在funs
中具有特殊含义。在这种情况下,它指的是虚拟参数。有关说明,请参阅 ?funs
。
funs
构造一个代表函数列表的"fun_list"
类对象。 funs
的每个参数是一个函数名、表示函数名的字符串或表示函数体的表达式。在最后一种情况下,在表示函数体的表达式中,函数的参数由点表示,因此 . == 5
指的是函数 function(.) . == 5
(尽管 dplyr 实际上并不构造该函数,而是使用 "fun_list"
对象)。
在这个例子中,mutate_each
将为每一列运行一次函数,这样它的作用与问题中的相同,只是它还会在每次构造函数时打印出输入(它实际上并没有构造,但我们可以这么想)被称为:
> out <- mutate_each(df, funs(print(.); . == 5))
[1] 1 2 3 4 5
[1] 1 2 3 4 5
[1] 1 2 3 4 5
[1] 1 2 3 4 5
[1] 1 2 3 4 5
在您的 filter
示例中,funs
未被使用,filter
无论如何都不适用于 "fun_list"
对象。
dot 在 dplyr 的其他上下文中具有其他含义,并且在其他包的其他上下文中也可以具有其他含义。
【讨论】:
以上是关于dplyr 句号字符“。”是啥意思?参考?的主要内容,如果未能解决你的问题,请参考以下文章