Tengo los siguientes datos:

gene_Id <- c( 'No_id' , 'P1_1_EXN' , 'P1_2_EXN' , 
              'P1_1_EXN_O' , 'P1_2_EXN_O' ,
              'P2_1_EXN' , 'P2_2_EXN' , 
              'P2_1_EXN_O' , 'P2_2_EXN_O' , 
             'P1nM1'  , 'P2nM1')

Count_F <- c(rep('KL',5),rep('KD',6))

DF <- data.frame(gene_Id , Count_F)

Me gustaría crear tres columnas adicionales: first_one debería reemplazar las celdas que tienen el patrón '_Number_' con 'gene_'Number' por ejemplo reemplazar P1_1_EXN con gene_1, con posibilidad de controlar el nombre de las cadenas de descanso que no coinciden con este criterio. también extraiga el resto de la cadena después del patrón '_Number_' como: tomando solo EXN​ en el ejemplo anterior y colóquelo en second_one .

third_one debe reemplazar cualquier celda que tenga 'P Number' con 'PREP Number', por ejemplo, reemplace P1_1_EXN con PREP _1

EDITAR: esta es la salida esperada.

PRER <- c ( 'No_P' ,rep('PREP_1' , 4) , rep('PREP_2' , 4) , 'PREP_1' , 'PREP_2')

Gene_Num <- c ('No_num' , 'gene_1' , 'gene_2' , 'gene_1' , 'gene_2' ,'gene_1',
               'gene_2', 'gene_1', 'gene_2'  , 'NEG' , 'NEG')

Rest <-c('No_rest','EXN','EXN','EXN_O','EXN_O','EXN','EXN','EXN_O','EXN_O', 'Neg','Neg')


New_DF <- cbind(DF,Gene_Num,Rest,PRER)

Muchas gracias de antemano.

0
Sam_9090 24 jun. 2020 a las 15:29

2 respuestas

La mejor respuesta

Aquí hay una posibilidad usando el paquete dplyr y case_when.

DF %>%
  mutate(col1 = case_when(grepl("_\\d_", gene_Id) ~ gsub(".*_(\\d)_.*", "gene_\\1", gene_Id),
                          TRUE ~ "dummy1"),
         col2 = case_when(grepl("_\\d_", gene_Id) ~ gsub("^.*_\\d_", "", gene_Id),
                          TRUE ~ "dummy2"),
         col3 = case_when(grepl("P\\d", gene_Id) ~ gsub(".*P(\\d).*", "PREP_\\1", gene_Id),
                          TRUE ~ "dummmy3"))

      gene_Id Count_F   col1   col2    col3
1       No_id      KL dummy1 dummy2 dummmy3
2    P1_1_EXN      KL gene_1    EXN  PREP_1
3    P1_2_EXN      KL gene_2    EXN  PREP_1
4  P1_1_EXN_O      KL gene_1  EXN_O  PREP_1
5  P1_2_EXN_O      KL gene_2  EXN_O  PREP_1
6    P2_1_EXN      KD gene_1    EXN  PREP_2
7    P2_2_EXN      KD gene_2    EXN  PREP_2
8  P2_1_EXN_O      KD gene_1  EXN_O  PREP_2
9  P2_2_EXN_O      KD gene_2  EXN_O  PREP_2
10      P1nM1      KD dummy1 dummy2  PREP_1
11      P2nM1      KD dummy1 dummy2  PREP_2

Aquí hay una pequeña explicación: primero verifico si la subcadena deseada está contenida en gene_ID usando grepl. En caso afirmativo, lo extraigo de acuerdo con las reglas. Si no, asigno un valor ficticio (los denominé dummy1, dummy2 y dummy3).

Utilizo expresiones regulares para hacer coincidir las cadenas: \\d coincide con un dígito y _\\d_ coincide con un dígito entre dos guiones bajos. Cuando se utiliza gsub \\1 se refiere a lo que coincidió en la primera parálisis: en este caso, siempre es un dígito.

Entonces, por ejemplo, la definición de col1 funciona así:

  1. verifique si encuentra el patrón _\\d_ dentro de gene_ID: en caso afirmativo, reemplace toda la cadena con gene_\\1 donde \\1 es el dígito entre los guiones bajos.
  2. Si no encuentra el patrón _\\d_ asigne "dummy1".
2
Cettt 24 jun. 2020 a las 12:57

Una alternativa usando dplyr y stringr:

DF %>%
  mutate(Gene     = str_c("gene", str_extract(gene_Id, "_\\d(?=_)")),
         Rest     = str_extract(gene_Id, "(?<=_\\d_).*"),
         P_Number = str_replace(str_extract(gene_Id, "P\\d"), "P", "PREP_"))

Devuelve

      gene_Id Count_F   Gene  Rest P_Number
1       No_id      KL   <NA>  <NA>     <NA>
2    P1_1_EXN      KL gene_1   EXN   PREP_1
3    P1_2_EXN      KL gene_2   EXN   PREP_1
4  P1_1_EXN_O      KL gene_1 EXN_O   PREP_1
5  P1_2_EXN_O      KL gene_2 EXN_O   PREP_1
6    P2_1_EXN      KD gene_1   EXN   PREP_2
7    P2_2_EXN      KD gene_2   EXN   PREP_2
8  P2_1_EXN_O      KD gene_1 EXN_O   PREP_2
9  P2_2_EXN_O      KD gene_2 EXN_O   PREP_2
10      P1nM1      KD   <NA>  <NA>   PREP_1
11      P2nM1      KD   <NA>  <NA>   PREP_2

No incluí un identificador para los casos <NA>.

1
Martin Gal 24 jun. 2020 a las 12:58