以下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
答案 0 :(得分:17)
点在dplyr中主要(非排他地)在mutate_each
,summarise_each
和do
中使用。在前两个(及其SE对应物)中,它指的是应用funs
中的函数的所有列。在do
中,它引用(可能已分组的)data.frame,因此您可以使用.$xyz
引用名为“xyz”的列来引用单个列。
无法运行的原因
filter(df, . == 5)
是因为a)filter
不适用于多个列,例如mutate_each
,b)你需要使用管道运算符%>%
(最初来自{{1} }})。
但是,当与管道运算符magrittr
结合使用时,您可以在rowSums
内使用filter
之类的函数:
%>%
您还应该查看magrittr帮助文件:
> 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
从帮助页面:
将lhs放在rhs调用的其他地方 通常你会希望lhs在另一个位置而不是第一个位置进行rhs调用。为此,您可以使用点(。)作为占位符。例如,
library(magrittr) help("%>%")
相当于y %>% f(x, .)
,而f(x, y)
相当于z %>% f(x, y, arg = .)
。将点用于辅助目的 通常,除了lhs本身的值之外,在rhs调用中还需要lhs的一些属性或属性,例如,行数或列数。在rhs调用中多次使用点占位符是完全有效的,但是在设计上 在嵌套中使用它时,行为略有不同 函数调用。特别是,如果占位符仅用于a 嵌套函数调用,lhs也将作为第一个参数放置! 这样做的原因是在大多数用例中产生的最多 可读代码。例如,
f(x, y, arg = z)
是 相当于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))
。
答案 1 :(得分:5)
点在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中的其他上下文中具有其他含义,并且对于其他包也可以在其他上下文中具有其他含义。