Calcular relación cada dos filas con partidos de cadena parcial

Estoy tratando de calcular una relación usando esta fórmula: log2(_5p/3p).

Tengo un marco de datos en R y las entradas tienen el mismo nombre excepto su última parte que será _3p o _5p. Quiero hacer esta operación log2(_5p/_3p) para cada nombre específico.

Por ejemplo para las dos primeras filas el resultado será así:

LQNS02277998.1_30988 log2(40/148)= -1.887525

Idealmente quiero crear un nuevo marco de datos con los resultados donde sólo se mantiene la parte común del nombre.

LQNS02277998.1_30988 -1.887525

¿Cómo puedo hacer esto en R?

> head(dup_res_LC1_b_2)
# A tibble: 6 x 2
  microRNAs                                  n
                                    
1 LQNS02277998.1_30988_3p                  148
2 LQNS02277998.1_30988_5p                   40
3 Dpu-Mir-279-o6_LQNS02278070.1_31942_3p     4
4 Dpu-Mir-279-o6_LQNS02278070.1_31942_5p     4
5 LQNS02000138.1_777_3p                     73
6 LQNS02000138.1_777_5p                     12


structure(list(microRNAs = c("LQNS02277998.1_30988_3p", 
"LQNS02277998.1_30988_5p", "Dpu-Mir-279-o6_LQNS02278070.1_31942_3p", 
"Dpu-Mir-279-o6_LQNS02278070.1_31942_5p", "LQNS02000138.1_777_3p", 
"LQNS02000138.1_777_5p"), n = c(148L, 40L, 4L, 4L, 73L, 12L)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

Pregunta hecha hace 3 años, 4 meses, 28 días - Por debugdynamob312


3 Respuestas:

  • Podemos utilizar un grupo por operación eliminando la subestring al final, es decir. _3p o _5p con str_remove, luego utilizar el log división del par de 'n'

    library(dplyr)
    library(stringr)
    df1 %>% 
       group_by(grp = str_remove(microRNAs, "_[^_]+$")) %>% 
       mutate(new = log2(last(n)/first(n)))
    

    Respondida el Dec 18, 2020 a las 16:33 - por Kairo

    Votos positivos: 0 | Votos negativos: 0

  • Para calcular la relación cada dos filas con partidos de cadena parcial en R y obtener el resultado deseado, puedes seguir los siguientes pasos:

    • Agregar una columna que contenga la parte común del nombre eliminando el sufijo "_3p" o "_5p" de la columna "microRNAs".
    • Realizar la operación logarítmica para cada par de filas con el mismo nombre común.
    • Crear un nuevo marco de datos con los resultados obtenidos.

    Aquí te muestro cómo puedes hacerlo:

    R
    library(dplyr)
    library(tidyr)
    
    

    Crear una columna con el nombre común eliminando el sufijo

    dup_res_LC1_b_2 <- dup_res_LC1_b_2 %>% mutate(common_name = gsub("_\\d+p", "", microRNAs))

    Filtrar para obtener solo las filas que contienen el sufijo "_3p"

    df_3p <- dup_res_LC1_b_2 %>% filter(str_detect(microRNAs, "_3p"))

    Filtrar para obtener solo las filas que contienen el sufijo "_5p"

    df_5p <- dup_res_LC1_b_2 %>% filter(str_detect(microRNAs, "_5p"))

    Combinar las dos bases de datos para hacer la operación logarítmica

    result <- inner_join(df_3p, df_5p, by = "common_name")

    Calcular la relación logarítmica para cada par de filas y agregarla como una nueva columna

    result <- result %>% mutate(log_ratio = log2(n.y / n.x))

    Seleccionar solo las columnas necesarias

    result <- result %>% select(common_name, log_ratio)

    Eliminar duplicados y ordenar por el nombre común

    result <- distinct(result) %>% arrange(common_name)

    Mostrar el resultado

    print(result)

    Con estos pasos, se creará un nuevo marco de datos con los resultados de la operación logarítmica para cada par de filas con el mismo nombre común. Además, se mantendrá únicamente la parte común del nombre en el nuevo marco de datos.

    Espero que esto te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 16:35 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Paso 1: Filtrar el marco de datos para obtener filas que terminan en "3p" o "5p"

    r
    df_filtered <- df %>%
      filter(str_detect(microRNAs, "_3p$") | str_detect(microRNAs, "_5p$"))
    

    Paso 2: Crear una columna que contenga solo la parte común del nombre

    r
    df_filtered$common_name <- str_replace(df_filtered$microRNAs, "_3p|_5p$", "")
    

    Paso 3: Calcular la relación y crear un nuevo marco de datos con los resultados

    r
    df_results <- df_filtered %>%
      group_by(common_name) %>%
      summarize(ratio = log2(mean(n[str_detect(microRNAs, "_5p$")])/mean(n[str_detect(microRNAs, "_3p$")])))
    

    Paso 4: Eliminar las columnas innecesarias

    r
    df_results <- df_results %>%
      select(common_name, ratio)
    

    Resultado final:

    r
    > df_results
    

    A tibble: 3 x 2

    common_name ratio 1 LQNS02277998.1 -1.887525 2 Dpu-Mir-279-o6_LQNS0… NA 3 LQNS02000138.1 -2.24073

    Nota: La relación para Dpu-Mir-279-o6_LQNS02278070.1 no se puede calcular porque no hay valores para _5p.

    Respondida el Dec 19, 2020 a las 16:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0