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
这是"所有专栏"的简写吗?这是.特定dplyr语法还是总则第语法(如讨论这里)?
另外,为什么以下代码会导致错误?
dplyr::filter(df, . == 5)
#  Error: object '.' not found
tal*_*lat 18
点在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)).
点中有特殊含义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中的其他上下文中具有其他含义,并且对于其他包也可以在其他上下文中具有其他含义.