Meg*_*ron 19 syntax arguments r dplyr
.
以下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
Run Code Online (Sandbox Code Playgroud)
这是"所有专栏"的简写吗?这是.
特定dplyr语法还是总则第语法(如讨论这里)?
另外,为什么以下代码会导致错误?
dplyr::filter(df, . == 5)
# Error: object '.' not found
Run Code Online (Sandbox Code Playgroud)
tal*_*lat 18
点在dplyr中主要(非排他地)用于mutate_each
,summarise_each
和do
.在前两个(及其SE对应物)中,它指的funs
是应用函数的所有列.在do
它中引用(可能已分组的)data.frame,因此您可以通过.$xyz
引用名为"xyz"的列来引用单个列.
你无法运行的原因
filter(df, . == 5)
Run Code Online (Sandbox Code Playgroud)
是因为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
Run Code Online (Sandbox Code Playgroud)
您还应该查看magrittr帮助文件:
library(magrittr)
help("%>%")
Run Code Online (Sandbox Code Playgroud)
从帮助页面:
将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))
.
点中有特殊含义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
Run Code Online (Sandbox Code Playgroud)
在您的filter
示例中,funs
未使用,filter
并且"fun_list"
无论如何都不能与对象一起使用.
dot在dplyr中的其他上下文中具有其他含义,并且对于其他包也可以在其他上下文中具有其他含义.