2012-07-27 14 views
5

मैं इस मुद्दे निम्नलिखित हैं में (। उदाहरण के लिए टीए दो कॉलम "A" करने के लिए पहले "टी" में विभाजित किया जाना चाहिए दूसरा), मैं हल कर सकते थे:आदेश जबकि बंटवारे आर

set.seed (1234) 
mydf <- data.frame (var1a = sample (c("TA", "AA", "TT"), 5, replace = TRUE), 
        varb2 = sample (c("GA", "AA", "GG"), 5, replace = TRUE), 
        varAB = sample (c("AC", "AA", "CC"), 5, replace = TRUE) 
        ) 
    mydf 

    var1a varb2 varAB 
1 TA AA CC 
2 AA GA AA 
3 AA GA AC 
4 AA AA CC 
5 TT AA AC 

मैं दो पत्र विभाजित करना चाहते हैं विभिन्न कॉलम में, और उसके बाद क्रमबद्ध रूप से क्रमबद्ध करें।

संपादित करें: विभाजन को विभाजित करने से पहले किया जा सकता है, उदाहरण के लिए var1a मान "टीए" var1a "एटी" होना चाहिए या विभाजन के बाद होना चाहिए ताकि var1aa "ए" होना चाहिए, और var1ab "टी" होना चाहिए ("टी" के बजाय , "ए")। तो सॉर्टिंग प्रत्येक सेल के भीतर है।

split_col <- function(.col, data){ 
    .x <- colsplit(data[[.col]], names = paste0(.col, letters[1:2])) 
    } 

विभाजन प्रत्येक स्तंभ और

require(reshape) 
    splitdf <- do.call(cbind, lapply(names(mydf), split_col, data = mydf)) 

var1aa var1ab varb2a varb2b varABa varABb 
1  T  A  A  A  C  C 
2  A  A  G  A  A  A 
3  A  A  G  A  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

गठबंधन लेकिन अनसुलझी हिस्सा मैं ऐसा है कि columnName "एक" और columname "बी" का आदेश दिया जाता है, वर्णानुक्रम स्तंभों की जोड़ी ऑर्डर करने के लिए चाहते हैं। इस प्रकार की उम्मीद उत्पादन:

var1aa var1ab varb2a varb2b varABa varABb 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

कैसे कर सकते हैं (कम चर की प्रत्येक जोड़ी के साथ) आदेश कर सकते हैं?

+0

आप का मतलब है कि स्तंभ की प्रत्येक जोड़ी में प्रत्येक पंक्ति के वर्णानुक्रम किए जाने की आवश्यकता है? यदि ऐसा है, तो आपको उस कथन को अपने प्रश्न में जोड़ना चाहिए क्योंकि यह बहुत अस्पष्ट है। – joran

+0

जैसा सवाल यह है कि यह असंगत है। कोड द्वारा बनाए गए डेटाफ्रेम आपके द्वारा ऑफ़र किए गए उदाहरण से मेल नहीं खाता है। कोड डेटा में केवल 2 'टी' हैं। इसके अलावा, "क्रमबद्ध रूप से क्रम" ऑपरेशन की प्रकृति अस्पष्ट है। क्या आप रेस्प्रेस ऑर्डर –

+0

में पहले कॉलम द्वारा ऑर्डर करना चाहते हैं तो आपका 'split_col' फ़ंक्शन मुझे एक त्रुटि देता है:' is.character (pattern) में त्रुटि: 'पैटर्न' गायब है –

उत्तर

5
mylist <-as.list(mydf) 

splits <- lapply(mylist, reshape::colsplit, names=c("a", "b")) 
rowsort <- lapply(splits, function(x) t(apply(x, 1, sort))) 
comb <- do.call(data.frame, rowsort) 
comb 

    var1a.1 var1a.2 varb2.1 varb2.2 varAB.a varAB.b 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

संपादित करें: नाम महत्वपूर्ण हैं , तो आप उन्हें बदल सकते हैं:

replaceNums <- function(x){ 
    .which <- regmatches(x, regexpr("[[:alnum:]]*(?=.)", x, perl=TRUE)) 
    stopifnot(length(x) %% 2 == 0) #checkstep 
    paste0(.which, c("a", "b")) 
} 

names(comb) <- replaceNums(names(comb)) 
comb 
    var1aa var1ab varb2a varb2b varABa varABb 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 
संबंधित मुद्दे