2015-12-22 14 views
6

Ho una matrice denominata mymat. Ho un vettore chiamato geno <- c("01","N1","11","1N","10"). Ho un altro tavolo chiamato key.table. Quello che voglio fare è corrispondere alla colonna key in key.table con la colonna key in mymat e Se i valori di colonna in una qualsiasi delle righe corrispondenti hanno uno qualsiasi degli elementi geno, voglio estrarre il nome di quella colonna da mymat lungo con l'elemento corrispondente geno e incollarlo nella nuova colonna in matched.extract in key.table nelle righe corrispondenti per ogni key e ottenere il risultato.Come abbinare 2 colonne dataframe ed estrarre valori di colonna e nomi di colonna?

mymat <- structure(c("chr5:12111", "chr5:12111", "chr5:12113", "chr5:12114", 
"chr5:12118", "0N", "0N", "1N", "0N", "0N", "00", "00", "00", 
"11", "10", "00", "00", "1N", "0N", "00"), .Dim = c(5L, 4L), .Dimnames = list(
    c("34", "35", "36", "37", "38"), c("key", "AMLM12001KP", 
    "AMAS-11.3-Diagnostic", "AMLM12014N-R"))) 

key.table<- structure(c("chr5:12111", "chr5:12111", "chr5:12113", "chr5:12114", 
"chr5:12118", "chr5:12122", "chr5:12123", "chr5:12123", "chr5:12125", 
"chr5:12127", "chr5:12129", "9920068", "9920069", "9920070", 
"9920071", "9920072", "9920073", "9920074", "9920075", "9920076", 
"9920077", "9920078"), .Dim = c(11L, 2L), .Dimnames = list(c("34", 
"35", "36", "37", "38", "39", "40", "41", "42", "43", "44"), 
    c("key", "variantId"))) 

risultato

key   variantId matched.extract 
34 "chr5:12111" "9920068"  NA 
35 "chr5:12111" "9920069"  NA 
36 "chr5:12113" "9920070"  AMLM12001KP (1N),AMLM12014N-R (1N) 
37 "chr5:12114" "9920071"  AMAS-11.3-Diagnostic (11) 
38 "chr5:12118" "9920072"  AMAS-11.3-Diagnostic (10) 
39 "chr5:12122" "9920073"  NA 
40 "chr5:12123" "9920074"  NA 
41 "chr5:12123" "9920075"  NA 
42 "chr5:12125" "9920076"  NA 
43 "chr5:12127" "9920077"  NA 
44 "chr5:12129" "9920078"  NA 
+0

Quindi siamo interessati solo ai valori di "1N", "11" e "10"? Non sei chiaro al riguardo. –

+0

@MikeWise Esatto, vogliamo solo estrarre solo se le celle hanno uno di questi valori. – MAPK

risposta

7

Utilizzando data.table, vorrei affrontare in questo modo:

library(data.table) 
# convert the 'key.table' matrix to a data.table 
kt <- as.data.table(key.table, keep.rownames=TRUE) 
# convert the 'mymat' matrix to a data.table and melt into long format 
# filter on the needed geno-types 
# paste the needed values together into the requested format 
mm <- melt(as.data.table(mymat, keep.rownames=TRUE), 
      id=c("rn","key"))[value %in% c("1N","11","10"), val := paste0(variable," (",value,")") 
          ][, .(val = paste(val[!is.na(val)], collapse = ",")), by = .(rn,key) 
           ][val=="", val:=NA] 
# join the 'mm' and 'kt' data.tables 
kt[mm, matched := val, on=c("rn","key")] 

che dà:

> kt 
    rn  key variantId       matched 
1: 34 chr5:12111 9920068         NA 
2: 35 chr5:12111 9920069         NA 
3: 36 chr5:12113 9920070 AMLM12001KP (1N),AMLM12014N-R (1N) 
4: 37 chr5:12114 9920071   AMAS-11.3-Diagnostic (11) 
5: 38 chr5:12118 9920072   AMAS-11.3-Diagnostic (10) 
6: 39 chr5:12122 9920073         NA 
7: 40 chr5:12123 9920074         NA 
8: 41 chr5:12123 9920075         NA 
9: 42 chr5:12125 9920076         NA 
10: 43 chr5:12127 9920077         NA 
11: 44 chr5:12129 9920078         NA 

Spiegazione:

  • kt <- as.data.table(key.table, keep.rownames=TRUE) convertirà la matrice key.table ad un data.table (che è un maggiore data.frame) e memorizza i rownames nella colonna rn.
  • mm <- melt(as.data.table(mymat, keep.rownames=TRUE), id=c("rn","key")) convertirà la matrice mymat in un data.table, memorizza i nomi di lavoro nella colonna rn e fonde data.table in formato lungo.
  • parte [value %in% c("1N","11","10"), val := paste0(variable," (",value,")")] inserirà il variable -Valori (che erano i columnnams in mymat) con le value -Valori solo nei casi in cui è value1N, 11 o 10.
  • parte [, .(val = paste(val[!is.na(val)], collapse = ",")), by = .(rn,key)] incollerà i non NA file di val insieme dai rn & key variabili.
  • parte [val=="", val:=NA] trasformerà le righe vuote per val in NA -Valori
  • infine kt[mm, matched := val, on=c("rn","key")] aggiorna il -data.table kt con riferimento alle val -Valori del mm -data.table per i corrispondenti rn & key variabili .

ATTENZIONE: Quando si utilizza data.table, è meglio non usare key come un nome di variabile come key è anche un parametro in una data.table. Vedi ?key per maggiori informazioni.

+1

Grazie mille, questo è esattamente ciò di cui ho bisogno. – MAPK

+0

Potrebbe aiutarmi a capire come hai usato la funzione di fusione qui. Sembra interessante e voglio davvero capirlo. Per favore spiega un po 'come si mettono 'val',' values' e 'paste0 (variabile," (", valore,") ")' nel contesto? – MAPK

+1

@MAPK Aggiunta una spiegazione e migliorata la risposta. HTH – Jaap

4

Io non sono che la familiarità con le funzioni dplyr. È possibile provare la funzione base R unione:

mm <- merge(key.table,mymat,by="key",all.x=T) 
mm 

funzione per incollare i nomi delle colonne con il tipo di tessuto:

get.geno <- function(x,y) ifelse(!x %in% c("00","0N") & !is.na(x), paste0(y," (",x,")"), NA) 
a <- t(apply(mm[,3:5], 1, get.geno, colnames(mm)[3:5])) 

finale dataframe:

mm$result <- apply(a, 1, function(x) paste(x[!is.na(x)] ,collapse=",")) 
mm[, -3:-5] 
      key variantId       result 
1 chr5:12111 9920068         
2 chr5:12111 9920068         
3 chr5:12111 9920069         
4 chr5:12111 9920069         
5 chr5:12113 9920070 AMLM12001KP (1N),AMLM12014N-R (1N) 
6 chr5:12114 9920071   AMAS-11.3-Diagnostic (11) 
7 chr5:12118 9920072   AMAS-11.3-Diagnostic (10) 
8 chr5:12122 9920073         
9 chr5:12123 9920074         
10 chr5:12123 9920075         
11 chr5:12125 9920076         
12 chr5:12127 9920077         
13 chr5:12129 9920078  
+0

Quindi come si presenta? –

+0

@MikeWise Grazie, ma vedi questa riga "36" chr5: 12113 "" 9920070 "AMLM12001KP (1N), AMLM12014N-R (1N)' ha più nomi. Ci interessa solo estrarre tutti i nomi delle colonne solo se le righe di corrispondenza delle chiavi hanno uno dei valori di 'geno' nella colonna. – MAPK

+0

Err, non sono sicuro di cosa significhi quel commento. –

1

Non esattamente sicuro di quello che vuoi , ma potrebbe essere vicino a questo:

library(reshape2) 
mymat <- structure(
    c("chr5:12111", "chr5:12111", "chr5:12113", "chr5:12114", 
    "chr5:12118", "0N", "0N", "1N", "0N", "0N", "00", "00", "00", 
    "11", "10", "00", "00", "1N", "0N", "00"), .Dim = c(5L, 4L), 
    .Dimnames = list(
    c("34", "35", "36", "37", "38"), 
    c("key", "AMLM12001KP", "AMAS-11.3-Diagnostic", "AMLM12014N-R"))) 

key.table<- structure(
    c("chr5:12111", "chr5:12111", "chr5:12113", "chr5:12114", 
    "chr5:12118", "chr5:12122", "chr5:12123", "chr5:12123", "chr5:12125", 
    "chr5:12127", "chr5:12129", "9920068", "9920069", "9920070", 
    "9920071", "9920072", "9920073", "9920074", "9920075", "9920076", 
    "9920077", "9920078"), .Dim = c(11L, 2L), 
    .Dimnames = list(
    c("34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44"), 
        c("key", "variantId"))) 

# work with dataframes 
mmdf <- data.frame(mymat) 
ktdf <- data.frame(key.table) 

tdf <- merge(mmdf,ktdf,by="key") 
mltdf <- melt(tdf,id.vars=c("key","variantId")) 
mltdf1 <- mltdf[mltdf$value != "0N" & mltdf$value != "00" ,] 

mltdf1 
.210

Cedendo:

  key variantId    variable value 
5 chr5:12113 9920070   AMLM12001KP 1N 
13 chr5:12114 9920071 AMAS.11.3.Diagnostic 11 
14 chr5:12118 9920072 AMAS.11.3.Diagnostic 10 
19 chr5:12113 9920070   AMLM12014N.R 1N 
Problemi correlati