在dplyr中,点号主要(但不是唯一)用于mutate_each
、summarise_each
和do
函数。在前两个函数中(及其SE的对应函数),它指代应用funs
中函数的所有列。在do
函数中,它指的是(可能分组的)数据框,因此您可以使用.$xyz
来引用名为“xyz”的列。
造成无法运行的原因:
filter(df, . == 5)
这是因为a)filter
不像mutate_each
那样设计用于处理多列数据,b)你需要使用管道运算符%>%
(最初来源于magrittr
)。
然而,当与管道运算符%>%
结合使用时,您可以在filter
内使用rowSums
函数来处理数据:
> filter(mtcars, rowSums(. > 5) > 4)
Error: Objekt '.' not found
> mtcars
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)
。
在rhs调用中使用点进行次要目的
经常需要在rhs调用中除了lhs本身的值之外,还需要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))
。