dplyr句号字符是什么“。”参考?

时间:2016-02-08 14:49:52

标签: r syntax arguments 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语法还是一般的R语法(如所讨论的here)?

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

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

2 个答案:

答案 0 :(得分:17)

点在dplyr中主要(非排他地)在mutate_eachsummarise_eachdo中使用。在前两个(及其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中的其他上下文中具有其他含义,并且对于其他包也可以在其他上下文中具有其他含义。