r: cómo cambiar simultáneamente varios nombres de columna basados en el sufijo individual de cada nombre de columna
He recibido y hoja de datos p
autogenerado de un registro y conteniendo metabolitos 1855. La autogeneración añade _vX
Automáticamente cada nombre de atributo donde X
bigXvideos el número de seguimientos. 3.2.2, esto crea nombres farmacocinéticos ridículamente largos.
Eg
p$MRI_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10
y p$MRI_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20
La RRM 10 y 20 en el mismo paciente. Es decir, cada atributo que farmacocinética clínicamente relacionado con los 10 extremos de seguimiento con v1_v2_v3_v4_v5_v6_v7_v8_v9_v10
.
Busco y solución, interoperabilidad en dplyr
o function
que cambia todo _v1_v2_...."
Sufiéntalo. fuX
correspondiente al seguimiento xth.
Digamos p
Parece que:
a_v2 b_v2_v3 a_v2_v3_v4 b_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20 a_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20
1 0 1 1 1 0
2 1 1 0 1 0
Producto previsto:
> p
a_fu2 b_fu3 a_fu4 b_fu20 a_fu20
1 0 1 1 1 0
2 1 1 0 1 0
Datos
p <- structure(list(dia_maxrd_v2 = c(0, 1), hear_sev_v2_v3 = c(1, 1), reop_ind_v2_v3_v4___1 = c(1,
0), neuro_def_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20 = c(1,
1), symp_pre_lokal_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20 = c(0,
0)), class = "data.frame", row.names = c(NA, -2L))
EDIT
Esto complica las cosas, algunos nombres de referencia terminan con "___1" OAO y realce de parámetro específico a ese parámetro clínico y debe serconazol, por ejemplo: _v1_v2_v3_v4___1
. Por lo tanto, esto todavía debe ser activo fu4
y el ___1
parte no debe ser sometida.
a_v2 b_v2_v3 a_v2_v3_v4___1 b_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20 a_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20
1 0 1 1 1 0
2 1 1 0 1 0
Producto previsto:
> p
a_fu2 b_fu3 a_fu4___1 b_fu20 a_fu20
1 0 1 1 1 0
2 1 1 0 1 0
EDIT
Mis disculpas, la solución a considerar debe la columna "básica" qué parámetro contener, por ejemplo post-quirúrgica. Es Sólo El _v1_v2_v3..._vX
- parte que debe ser sustituida con el correspondiente fuX
. ¿Qué pasa? Antes y después El _v1_v2_v3..._vX
- La parte debe estar activa.
Home
dia_maxrd_v2 hear_sev_v2_v3 reop_ind_v2_v3_v4___1 neuro_def_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20 symp_pre_lokal_v1_v2_v3_v4_v5_v6_v7_v8_v9_v10_v11_v12_v13_v14_v15_v16_v17_v18_v19_v20
1 0 1 1 1 0
2 1 1 0 1 0
Producto previsto:
> p
dia_maxrd_fu2 hear_sev_fu3 reop_ind_fu4___1 neuro_def_fu20 symp_pre_lokal_fu20
1 0 1 1 1 0
2 1 1 0 1 0
Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelpilot
3 Respuestas:
-
Puedes usar
gsub
con dos grupos de captura:names(p) <- gsub("^(.).*?(\\d+)$", "\\1_fu\\2", names(p)) p #> a_fu2 b_fu3 a_fu4 b_fu20 a_fu20 #> 1 0 1 1 1 0 #> 2 1 1 0 1 0
EDIT
Con nuevos requisitos estipulados por OP para incluir en la tubería para tener algunos finales diferentes no en la pregunta original:
p %>% setNames(gsub("^(.).*?(\\d+_*\\d*)$", "\\1_fu\\2", names(.))) #> a_fu2 b_fu3 a_fu4___1 b_fu20 a_fu20 #> 1 0 1 1 1 0 #> 2 1 1 0 1 0
EDIT
Para cadenas de inicio arbitrarias, puede ser más fácil
gsub
Dos veces:p %>% setNames(gsub("(\\d{1,2}_v)+", "", names(.))) %>% setNames(gsub("_v(\\d+)", "_fu\\1", names(.))) #> dia_maxrd_fu2 hear_sev_fu3 reop_ind_fu4___1 neuro_def_fu20 #> 1 0 1 1 1 #> 2 1 1 0 1 #> symp_pre_lokal_fu20 #> 1 0 #> 2 0
Respondida el Dec 17, 2020 a las 13:13 - por codecanvas
Votos positivos: 0 | Votos negativos: 0 -
Para cambiar simultáneamente varios nombres de columna basados en el sufijo individual de cada nombre de columna en R, puedes utilizar el paquete
dplyr
y la funciónrename_with()
. Aquí te dejo un ejemplo de cómo podrías hacerlo:R library(dplyr)
Definir una función para extraer el sufijo de un nombre de columna
extract_suffix <- function(col_name) {Extraer todo después del último "_v"
suffix <- sub("^._v", "", col_name) return(suffix) }Aplicar la función para renombrar las columnas en el data frame 'p'
p <- p %>% rename_with(~ paste0(sub("_v.", "", .x), "_fu", extract_suffix(.x)), everything())Imprimir el resultado
print(p)En este código, la función
extract_suffix()
se utiliza para extraer el número de seguimiento de cada nombre de columna. Luego, se aplica la funciónrename_with()
dedplyr
para renombrar todas las columnas en el data framep
de acuerdo al formato deseado.Espero que esta solución te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 18, 2020 a las 13:13 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Claro, aquí tienes una solución usando la función
gsub
de R para reemplazar el sufijo_v[1-20]
confu[1-20]
en los nombres de las columnas:Crea una lista de los nombres de las columnas que terminan en _v[1-20]
columnas_a_cambiar <- names(p)[grepl("_v[1-20]$", names(p))]Reemplaza el sufijo _v[1-20] con fu[1-20] en los nombres de las columnas
names(p)[columnas_a_cambiar] <- gsub("_v[1-20]$", "_fu\\1", columnas_a_cambiar)Esto debería producir el resultado deseado:
> p dia_maxrd_fu2 hear_sev_fu3 reop_ind_fu4___1 neuro_def_fu20 symp_pre_lokal_fu20 1 0 1 1 1 0 2 1 1 0 1 0
Nota: Asegúrate de reemplazar
p
con el nombre de tu marco de datos real.Respondida el Dec 18, 2020 a las 13:22 - por Gemini
Votos positivos: 0 | Votos negativos: 0