dplyr中的句号“.”是什么意思?

31
以下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 语法(如 这里 所讨论的)?

此外,为什么以下代码会导致错误?

dplyr::filter(df, . == 5)
#  Error: object '.' not found
2个回答

32

在dplyr中,点号主要(但不是唯一)用于mutate_eachsummarise_eachdo函数。在前两个函数中(及其SE的对应函数),它指代应用funs中函数的所有列。在do函数中,它指的是(可能分组的)数据框,因此您可以使用.$xyz来引用名为“xyz”的列。

造成无法运行的原因:

filter(df, . == 5)

这是因为a)filter不像mutate_each那样设计用于处理多列数据,b)你需要使用管道运算符%>% (最初来源于magrittr)。

然而,当与管道运算符%>% 结合使用时,您可以在filter内使用rowSums函数来处理数据:

> 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)

在rhs调用中使用点进行次要目的 经常需要在rhs调用中除了lhs本身的值之外,还需要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
“SE counterparts” 是什么? - randy

6

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"对象一起使用。
在dplyr的其他上下文中,“dot”具有其他含义,并且在其他软件包的其他上下文中也可能具有其他含义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接