dplyr句号字符是什么"." 参考?

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_eachdo.在前两个(及其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)).

  • 什么是“SE对应方”? (2认同)

G. *_*eck 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
Run Code Online (Sandbox Code Playgroud)

在您的filter示例中,funs未使用,filter并且"fun_list"无论如何都不能与对象一起使用.

dot在dplyr中的其他上下文中具有其他含义,并且对于其他包也可以在其他上下文中具有其他含义.