div - ¿A qué se refiere el carácter "." Del período dplyr?
sidebarpanel shiny (2)
El punto se utiliza dentro de dplyr principalmente (no exclusivamente) en mutate_each
, summarise_each
y do
. En los primeros dos (y sus homólogos de SE) se refiere a todas las columnas a las que se aplican las funciones en funs
. En do
se refiere al data.frame (potencialmente agrupado) para que pueda hacer referencia a columnas individuales usando .$xyz
para hacer referencia a una columna llamada "xyz".
Las razones por las que no puedes correr
filter(df, . == 5)
es porque a) el filter
no está diseñado para trabajar con varias columnas como mutate_each
por ejemplo, yb) tendría que usar el operador de tubería %>%
(originalmente de magrittr
).
Sin embargo, puede usarlo con una función como rowSums
dentro del filter
cuando se combina con el operador de tubería %>%
:
> 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
También deberías echar un vistazo a los archivos de ayuda magrittr:
library(magrittr)
help("%>%")
Desde la página de ayuda:
Colocación de lhs en otro lugar en la llamada a rhs A menudo querrá que lhs a la llamada a rhs en otra posición que la primera. Para este propósito puedes usar el punto (.) Como marcador de posición. Por ejemplo,
y %>% f(x, .)
Es equivalente af(x, y)
z %>% f(x, y, arg = .)
Es equivalente af(x, y, arg = z)
.Uso del punto para fines secundarios A menudo, se desea algún atributo o propiedad de lhs en la llamada a rhs además del valor de lhs en sí, por ejemplo, el número de filas o columnas. Es perfectamente válido usar el marcador de posición de puntos varias veces en la llamada a rhs, pero por diseño, el comportamiento es ligeramente diferente cuando se usa dentro de llamadas de función anidadas. En particular, si el marcador de posición solo se usa en una llamada de función anidada, ¡lhs también se colocará como el primer argumento! La razón de esto es que en la mayoría de los casos de uso, esto produce el código más legible. Por ejemplo,
iris %>% subset(1:nrow(.) %% 2 == 0)
es equivalente airis %>% subset(., 1:nrow(.) %% 2 == 0)
pero un poco más compacto . Es posible anular este comportamiento encerrando los rs entre llaves. Por ejemplo,1:10 %>% {c(min(.), max(.))}
Es equivalente ac(min(1:10), max(1:10))
.
Qué hace el período .
Referencia en el siguiente código 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
¿Es esta abreviatura para "todas las columnas"? Es esto ¿La sintaxis específica de dplyr o es la sintaxis general de R (como se explica here )?
Además, ¿por qué el siguiente código produce un error?
dplyr::filter(df, . == 5)
# Error: object ''.'' not found
El punto tiene un significado especial dentro de las funs
. En ese contexto se refiere al parámetro dummy. Ver ?funs
para una descripción.
funs
construye un objeto de clase "fun_list"
que representa una lista de funciones. Cada argumento de funs
es un nombre de función, una cadena de caracteres que representa un nombre de función o una expresión que representa el cuerpo de la función. En el último caso, dentro de la expresión que representa el cuerpo de la función, el argumento de la función se representa con un punto para que . == 5
. == 5
refiere a la función de function(.) . == 5
function(.) . == 5
(aunque dplyr en realidad no construye esa función, sino que utiliza un objeto "fun_list"
lugar).
En este ejemplo, mutate_each
ejecutará la función una vez para cada columna, de modo que haga lo mismo que en la pregunta, excepto que también imprime la entrada cada vez que la función construida (en realidad no está construida, pero podemos pensar en ello de esa manera) ) se llama:
> 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
En su ejemplo de filter
, funs
no se está utilizando y el filter
no funciona con los objetos "fun_list"
todos modos.
dot tiene otros significados dentro de otros contextos dentro de dplyr y puede tener otros significados dentro de otros contextos para otros paquetes también.