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 functionque 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ón rename_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ón rename_with() de dplyr para renombrar todas las columnas en el data frame p 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] con fu[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