es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Herramientas VT Decompose – Mediana DP

Tengo una tabla de Chr, pos, ref, alt, DP mediana que era multialélica pero se convirtió a bialélica utilizando vt decompose. Sin embargo, la mediana de DP no se convierte en bialélica incluso con -s. Lo que me deja con una tabla como:

Información de posición mediana DP
3 CHR3 POS1 A G 1,1,2
3 CHR3 POS1 A C 1,1,2
3 CHR3 POS1 A T 1,1,2
5 CHR3 POS2 C AT 10,19,4,2.5,25
5 CHR3 POS2 C T 10,19,4,2.5,25
5 CHR3 POS2 C AGT 10,19,4,2.5,25
5 CHR3 POS2 C CG 10,19,4,2.5,25
5 CHR3 POS2 C G 10,19,4,2.5,25

Necesito encontrar una manera de tomar las primeras 5 columnas y luego el número correspondiente de la sexta columna:

Información de posición mediana DP
3 CHR3 POS1 A G 1
3 CHR3 POS1 A C 1
3 CHR3 POS1 A T 2
5 CHR3 POS2 C AT 10
5 CHR3 POS2 C T 19
5 CHR3 POS2 C AGT 4
5 CHR3 POS2 C CG 2.5
5 CHR3 POS2 C G 25

Por alguna razón, simplemente no puedo entender un método. El número en la primera columna es la cantidad de variantes en esa posición y va hasta 46 en mis datos. Intenté usar un comando awk pero me di cuenta de que necesitaba escribir mucho y de que debe haber una manera mucho más fácil que aún no he pensado.

Muchas gracias por cualquier ayuda que alguien pueda brindar.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para extraer el número correspondiente de la sexta columna, puedes dividir los valores de la columna “mediana DP” usando la ‘,’ (coma) como delimitador y tomar el número basado en la posición del alelo alternativo (el alelo ref siempre es el primer alelo y el alelo alt es el segundo en tus datos). Así es como puedes hacerlo usando Python:

    import pandas as pd
    
    # lee la tabla en un DataFrame de pandas
    df = pd.read_table("input.txt")
    
    # divide los valores de la columna "mediana DP" y extrae el valor para el alelo alternativo
    ref_alt = df["Ref"] + "," + df["Alt"]
    alt_idx = [x.split(',').index(y) + 1 for x, y in zip(df["Median_DP"], ref_alt)]
    alt_dp = [x.split(',')[i-1] for x, i in zip(df["Median_DP"], alt_idx)]
    
    # crea un nuevo DataFrame con las columnas requeridas
    new_df = pd.DataFrame()
    new_df["Información de la posición"] = df["Chr"].astype(str) + " " + df["Start_Pos"].astype(str) + " " \
                              + df["Ref"] + " " + df["Alt"]
    new_df["mediana DP"] = alt_dp
    
    # escribe la nueva tabla en un archivo
    new_df.to_csv("output.txt", sep="\t", index=False)
    

    Explicación:

    • Primero, la tabla de entrada se lee en un DataFrame de pandas, asumiendo que es un archivo de texto separado por tabulaciones.

    • A continuación, se construye una cadena que combina los alelos ref y alt para cada fila, que se utilizará para extraer la cobertura de profundidad mediana específica del alelo correspondiente.

    • Luego, se recorre cada valor separado por comas en la columna “mediana DP” y se extrae el valor de cobertura de profundidad según el índice del alelo alternativo, que se obtiene dividiendo la cadena ref/alt y encontrando la posición del alelo alt en esta lista.

    • Finalmente, se crea un nuevo DataFrame que contiene las columnas requeridas y se escribe en un archivo de texto separado por tabulaciones utilizando el método to_csv().

Comments are closed.