2011-05-17 11 views
36

नीचे दिए गए उदाहरण में मेरे पास दो डेटासेट (ज़ेड और ए) हैं। मैं आईएलएमएन संख्याओं द्वारा इन सेटों को मर्ज या गठबंधन करना चाहता हूं। यदि कोई मैच नहीं है, तो एनए भरें।राउनम्स द्वारा मर्ज या गठबंधन

z <- matrix(c(0,0,1,1,0,0,1,1,0,0,0,0,1,0,1,1,0,1,1,1,1,0,0,0,"RND1","WDR", "PLAC8","TYBSA","GRA","TAF"), nrow=6, 
    dimnames=list(c("ILMN_1651838","ILMN_1652371","ILMN_1652464","ILMN_1652952","ILMN_1653026","ILMN_1653103"),c("A","B","C","D","symbol"))) 

t<-matrix(c("GO:0002009", 8, 342, 1, 0.07, 0.679, 0, 0, 1, 0, 
     "GO:0030334", 6, 343, 1, 0.07, 0.065, 0, 0, 1, 0, 
     "GO:0015674", 7, 350, 1, 0.07, 0.065, 1, 0, 0, 0), nrow=10, dimnames= list(c("GO.ID","LEVEL","Annotated","Significant","Expected","resultFisher","ILMN_1652464","ILMN_1651838","ILMN_1711311","ILMN_1653026"))) 

परिणाम इस तरह होगा:

   [,1]   [,2]   [,3]   [,4] 
GO.ID  "GO:0002009" "GO:0030334" "GO:0015674" NA 
LEVEL  "8"   "6"   "7"   NA 
Annotated "342"  "343"  "350"   NA 
Significant "1"   "1"   "1"   NA 
Expected  "0.07"  "0.07"  "0.07"  NA 
resultFisher "0.679"  "0.065"  "0.065"  NA 
ILMN_1652464 "0"   "0"   "1"   PLAC8 
ILMN_1651838 "0"   "0"   "0"   RND1 
ILMN_1711311 "1"   "1"   "0"   NA 
ILMN_1653026 "0"   "0"   "0"   GRA 

उत्तर

34

उपयोग match अपने मैट्रिक्स

cbind(t, z[, "symbol"][match(rownames(t), rownames(z))]) 

      [,1]   [,2]   [,3]   [,4] 
GO.ID  "GO:0002009" "GO:0030334" "GO:0015674" NA  
LEVEL  "8"   "6"   "7"   NA  
Annotated "342"  "343"  "350"  NA  
Significant "1"   "1"   "1"   NA  
Expected  "0.07"  "0.07"  "0.07"  NA  
resultFisher "0.679"  "0.065"  "0.065"  NA  
ILMN_1652464 "0"   "0"   "1"   "PLAC8" 
ILMN_1651838 "0"   "0"   "0"   "RND1" 
ILMN_1711311 "1"   "1"   "0"   NA  
ILMN_1653026 "0"   "0"   "0"   "GRA" 

पी एस करने के लिए अपने वांछित वेक्टर वापस जाने के लिए है, तो cbind यह। चेतावनी दीजिये कि t आधार आर फ़ंक्शन है जिसका उपयोग matrices को स्थानांतरित करने के लिए किया जाता है। टी नामक एक चर बनाकर, यह आपके डाउनस्ट्रीम कोड में भ्रम पैदा कर सकता है।

+0

आपका जवाब बहुत उपयोगी धन्यवाद है rownames साथ एकाधिक फ्रेम बाध्य कर सकते हैं। केवल एक चीज यह है कि मेरा कोड कठोर उत्पादन नहीं देता है। मैं केवल इस लेते हैं: z [, "प्रतीक"] [मैच (rownames (टी), rownames (z))] एक कारक एनए और प्रतीकों लेकिन जब मैं cbind करते हैं, प्रतीक नंबर एक rondom मान से बदल जाता है के साथ बनाई गई है । क्या किसी को पता है कि गलत है? धन्यवाद – Lisann

+2

कृपया अपने पीएस में त्रुटि को सही करें। आप _not_ 't' फ़ंक्शन को ओवरराइट कर रहे हैं। आप उपयोगकर्ताओं के लिए भ्रम पैदा कर रहे हैं, लेकिन विभिन्न स्थानों पर डेटा और फ़ंक्शंस संग्रहीत किए जाते हैं। आगे बढ़ें, इसका परीक्षण करें: टी <- मैट्रिक्स (1: 4, 2, 2); टी (टी) ... काम करता है। –

+0

क्या यह समाधान बाहरी जुड़ाव के लिए काम करता है? –

3

सही लेकिन पास नहीं:

newcol<-sapply(rownames(t), function(rn){z[match(rn, rownames(z)), 5]}) 
cbind(data.frame(t), newcol) 
40

का उपयोग करते हुए विलय और टीटी के रूप में अपने टी वेक्टर (देखें Andrie के पी एस) का नाम बदलने:

merge(tt,z,by="row.names",all.x=TRUE)[,-(5:8)] 

अब अगर आप मैट्रिक्स के बजाय dataframes साथ काम करेंगे , यह और भी एक पूरी बहुत आसान हो जाएगा:

z <- as.data.frame(z) 
tt <- as.data.frame(tt) 
merge(tt,z["symbol"],by="row.names",all.x=TRUE) 
1
cbind.fill <- function(x, y){ 
    xrn <- rownames(x) 
    yrn <- rownames(y) 
    rn <- union(xrn, yrn) 
    xcn <- colnames(x) 
    ycn <- colnames(y) 
    if(is.null(xrn) | is.null(yrn) | is.null(xcn) | is.null(ycn)) 
    stop("NULL rownames or colnames") 
    z <- matrix(NA, nrow=length(rn), ncol=length(xcn)+length(ycn)) 
    rownames(z) <- rn 
    colnames(z) <- c(xcn, ycn) 
    idx <- match(rn, xrn) 
    z[!is.na(idx), 1:length(xcn)] <- x[na.omit(idx),] 
    idy <- match(rn, yrn) 
    z[!is.na(idy), length(xcn)+(1:length(ycn))] <- y[na.omit(idy),] 
    return(z) 
} 
1

आप

mbind<-function(...){ 
Reduce(function(x,y){cbind(x,y[match(row.names(x),row.names(y)),])}, list(...)) 
} 

यहाँ एक सामान्य समारोह में -Andrie जवाब लपेट कर सकते हैं, आप के रूप में कुंजी

संबंधित मुद्दे