Tengo un marco de datos en R con 341 filas. Quiero cambiar el nombre de las filas usando una lista con 349 nombres. Seguro que los 341 nombres estarán en esta lista. Pero no todos serán aciertos perfectos. Los datos se ven así

rownames(df_RPM1)
[1] "LQNS02059392.1_11686_5p"
[2] "LQNS02277998.1_30984_3p"
[3] "LQNS02277998.1_30984_5p"
[4] "LQNS02277998.1_30988_3p"
[5] "LQNS02277998.1_30988_5p"
[6] "LQNS02277997.1_30943_3p"
[7] "miR-9|LQNS02278070.1_31740_3p"
[8] "miR-9|LQNS02278094.1_36129_3p" 

head(inlist)
[1] "dpu-miR-2-03_LQNS02059392.1_11686_5p"  "dpu-miR-10-P2_LQNS02277998.1_30984_3p"
[3] "dpu-miR-10-P2_LQNS02277998.1_30984_5p" "dpu-miR-10-P3_LQNS02277998.1_30988_3p"
[5] "dpu-miR-10-P3_LQNS02277998.1_30988_5p" "miR-9|LQNS02278070.1_31740_3p" 
[6] "miR-9|LQNS02278094.1_36129_3p" 

El orden no será necesariamente el mismo en los dos.

¿Alguien puede sugerirme cómo hacer esto en R? Muchas gracias

0
Amaranta_Remedios 27 ago. 2020 a las 00:04

1 respuesta

La mejor respuesta

Depende mucho de cómo se vea un "golpe no perfecto". Suponiendo que el nombre de la fila es una subcadena del nombre real, str_detect() hace el trabajo bastante bien:

library(tidyverse)
real_names <- c("dpu-miR-2-03_LQNS02059392.1_11686_5p",
                  "dpu-miR-10-P2_LQNS02277998.1_30984_3p",
                  "dpu-miR-10-P2_LQNS02277998.1_30984_5p",
                  "dpu-miR-10-P3_LQNS02277998.1_30988_3p",
                  "dpu-miR-10-P3_LQNS02277998.1_30988_5p",
                  "miR-9|LQNS02278070.1_31740_3p",
                  "miR-9|LQNS02278094.1_36129_3p")

str_which(real_names, "LQNS02059392.1_11686_5p")
#> [1]  1

Entonces podemos vectorizar (eliminé el elemento 6 que no se encuentra en la lista de ejemplo):

pos <- map_int(rownames(df_RPM1), ~ str_which(real_names, fixed(.)))
pos
#> [1] 1 2 3 4 5 6 7

Y todo lo que queda es cambiar los nombres de las filas:

rownames(df_RPM1) <- real_names[pos]

Por supuesto, si un resultado no perfecto significa algo más complicado, es posible que deba crear una expresión regular a partir de los nombres de las filas o algo así.

1
Alexlok 27 ago. 2020 a las 04:26