Tengo un marco de datos con las columnas id, característica_1, característica_2, característica_3 de la siguiente manera.
df = data.frame(
id = sample(letters, 5),
feature_1 = sample(1:10, 5),
feature_2 = runif(5),
feature_3 = rnorm(5)
)
Quiero cambiar el nombre de todas las columnas de funciones agregando un prefijo. La siguiente línea no funciona y genera un error.
df %>%
rename_with(~(ifelse(names(.x) == "id", paste0("source_", names(.x)), "id")))
Error in names[cols] <- .fn(names[cols], ...) :
replacement has length zero
¿Alguna pista sobre cómo modificar esto? ¿Qué representa .x dentro de rename_with? ¡Gracias de antemano!
------------------------------------
library(dplyr)
df %>%
rename_with(~ paste0("source_", .), -id)
El tercer argumento para rename_with es .cols, donde puede usar la sintaxis tidyselect para seleccionar las columnas. Aquí -id excluye esta columna.
Según los comentarios, . La sintaxis es un estilo más limpio/simple que escribir una función anónima, pero puedes lograr esto.equivalentemente como:
df %>%
rename_with(function(x) paste0("source_", x), -id)
# R >= 4.1.0
df %>%
rename_with(\(x) paste0("source_", x), -id)
5
¡Gracias LMc! ¿Qué representa el punto dentro de rename_with? Noto que algunas funciones de dplyr usan dot y otras usan .x. ¿Cuáles son las diferencias entre ellos?
- Pescado dorado salado
19/03/2021 a las 18:51
La sintaxis de puntos se refiere a la columna sobre la cual se encuentra la función.siendo aplicado. Cualquiera . o .x se reconocerá como esta referencia.
-LMc
19/03/2021 a las 18:56
Para rename_with, ¿parece que el punto representa el nombre de la columna? Si cambio el comando a df %>% rename_with(~(ifelse(.x == "id", paste0("source_", .x), "id"))), no funciona. Tampoco funciona.
- Pescado dorado salado
19/03/2021 a las 19:00
En esta función específica, pero en términos más generales, eso es lo que representan los puntos. Por ejemplo, df %>% mutate(across(starts_with("feature"), ~ . + 1)) el punto no representa el nombre de la columna.
-LMc
19/03/2021 a las 19:09
1
¡Gracias LMc! Para mis propósitos, necesitaba excluir varias columnas usando la identificación de la columna, así que aquí está la sintaxis en caso de que otros la necesiten. df %>% rename_with(~ pegar0("fuente_", .), .cols = -c(1:2,4))
- Susie Derkins
17/03/2023 a las 19:03
------------------------------------
names(df) <- paste0("Source_", names(df))
Este es un modelo para la solución. Para aplicar la modificación a un subconjunto de nombres, utilice la indexación, como en
i <- grep("feature", names(df))
names(df)[i] <- paste0("Source_", names(df)[i])
Aquí, i es una serie de índices de los nombres a modificar. No importa cómo se cree, pero grep es una excelente manera de hacerlo cuando el criterio se basa en el nombre mismo.
2
¡Gracias, whuber! Tengo curiosidad acerca de la implementación en dplyr usando código r con formato de canalización y la funcionalidad de .x pasando dentro de la función rename_with.
- Pescado dorado salado
19/03/2021 a las 18:45
Eso parece (en el mejor de los casos) una forma indirecta de hacer algo que es simple y directamente compatible con base R.
- ¿quién es?
19/03/2021 a las 18:46