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_eachsummarise_eachdo 中使用。在前两个(以及它们的 SE 对应项)中,它指的是应用了 funs 中的函数的所有列。在do 中,它指的是(可能分组的)data.frame,因此您可以通过使用.$xyz 引用名为“xyz”的列来引用单个列。

无法运行的原因

filter(df, . == 5)

是因为 a) filter 并非设计用于处理多个列,例如 mutate_each,b) 您需要使用管道运算符 %&gt;%(最初来自 magrittr)。

但是,当与管道运算符 %&gt;% 结合使用时,您可以将其与 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 %&gt;% f(x, .) 等价于f(x, y)z %&gt;% f(x, y, arg = .) 等价于f(x, y, arg = z)

将圆点用于次要目的 通常,除了 lhs 本身的值之外,在 rhs 调用中还需要 lhs 的某些属性或属性,例如行数或列数。在 rhs 调用中多次使用点占位符是完全有效的,但这是设计使然 在嵌套中使用时行为略有不同 函数调用。特别是,如果占位符仅用于 嵌套函数调用,lhs 也将作为第一个参数! 这样做的原因是,在大多数用例中,这会产生最多 可读的代码。例如,iris %&gt;% subset(1:nrow(.) %% 2 == 0) 是 相当于iris %&gt;% subset(., 1:nrow(.) %% 2 == 0),但稍微 更紧凑。可以通过封闭来推翻这种行为 大括号中的 rhs。例如,1:10 %&gt;% 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 句号字符“。”是啥意思?参考?的主要内容,如果未能解决你的问题,请参考以下文章

period是啥意思

period是啥意思

period1&2是啥意思

period是啥意思

period是啥意思

period是啥意思