Tengo dos grandes tramas de datos, uno (df1) tiene esta estructura

   chr    init
1  12  25289552
2   3 180418785
3   3 180434779

El otro (df2) tiene esta

    V1    V2     V3
10  1     69094 medium
11  1     69094 medium
12  12 25289552 high
13  1     69095 medium
14  3 180418785 medium
15  3 180434779 low

Lo que estoy tratando de hacer es agregar la columna V3 de df2 a df1, para obtener la información de la mutación

   chr    init  Mut
1  12  25289552 high
2   3 180418785 medium
3   3 180434779 low

Estoy tratando de cargar en R y, a continuación, hacer un bucle para el uso de partido, pero no funciona. ¿Conoces alguna forma especial para hacer esto? También estoy abierto a hacer uso de awk o algo similar

OriginalEl autor user976991 | 2012-11-08

4 Comentarios

  1. 14

    Uso merge

    df1 <- read.table(text='  chr    init
    1  12  25289552
    2   3 180418785
    3   3 180434779', header=TRUE)
    
    
    df2 <- read.table(text='    V1    V2     V3
    10  1     69094 medium
    11  1     69094 medium
    12  12 25289552 high
    13  1     69095 medium
    14  3 180418785 medium
    15  3 180434779 low', header=TRUE)
    
    
    merge(df1, df2, by.x='init', by.y='V2') # this works!
           init chr V1     V3
    1  25289552  12 12   high
    2 180418785   3  3 medium
    3 180434779   3  3    low

    Para obtener el resultado que desea obtener la forma de mostrar

    output <- merge(df1, df2, by.x='init', by.y='V2')[, c(2,1,4)]
    colnames(output)[3] <- 'Mut' 
    output
      chr      init    Mut
    1  12  25289552   high
    2   3 180418785 medium
    3   3 180434779    low
    Sí, esto es lo que quiero, el punto es que tengo que tomar en cuenta el cromosoma también, así que tal vez algo así como que la combinación(df1, df2, por.x=c(‘chr’,’init’), por.y=c(‘V1’V2’)[, c(2,1,4)]
    Exactamente, sólo añadir chr y V1 a los argumentos que se tendrá en cuenta 😀 Considerar upvote las respuestas útiles y aceptar uno de ellos por si te resulta útil 😀

    OriginalEl autor Jilber Urbina

  2. 2
    df1 <- read.table(textConnection("   chr    init
     1  12  25289552
     2   3 180418785
     3   3 180434779"), header=T)
    
    df2 <- read.table(textConnection("    V1    V2     V3
     10  1     69094 medium
     11  1     69094 medium
     12  12 25289552 high
     13  1     69095 medium
     14  3 180418785 medium
     15  3 180434779 low"), header=T)
    
    # You have to select the values of df2$V3 such as their corresponding V2 
    # are equal to the values of df1$init
    df1$Mut <- df2$V3[ df2$V2 %in% df1$init]
    
    df1
      chr      init    Mut
    1  12  25289552   high
    2   3 180418785 medium
    3   3 180434779    low
    Tenga en cuenta que esto no funcionará si hay valores de clave en df1 que se ausente de df2. Usted podría obtener un error como «reemplazo tiene 3 filas de datos, dispone de 4». Consulte stackoverflow.com/questions/1299871/… para un left join utilizando la implementación match().

    OriginalEl autor plannapus

  3. 0

    Hace

    df3 <- merge( df1, df2, by.x = "init", by.y = "V2" )
    df3 <- df3[-3]
    colnames( df3 )[3] <- "Mut"

    darle lo que quiere?

    OriginalEl autor vaettchen

  4. 0

    @user976991 comentario trabajó para mí.

    Misma idea pero deben coincidir en dos columnas.

    Mi contexto de dominio es un producto de base de datos con múltiples entradas (potencialmente precio de las entradas). Quieres dejar de los mayores update_nums y mantener sólo la más reciente por product_id.

    raw_data <- data.table( product_id = sample(10:13, 20, TRUE), update_num = sample(1:3, 20, TRUE), stuff = rep(1, 20, sep = ''))
    max_update_nums <- raw_data[ , max(update_num), by = product_id]
    distinct(merge(dt, max_update_nums, by.x = c("product_id", "update_num"), by.y = c("product_id", "V1")))

    OriginalEl autor Eric Rohlfs

Dejar respuesta

Please enter your comment!
Please enter your name here