r: cambie el nombre de todas las columnas excepto la columna de identificación agregando un prefijo usando dplyr

CorePress2024-01-16  9

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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare