2012-04-27 11 views
5

यहाँ में त्रुटि छोटा सा उदाहरण है:अनुवाद (recoding) आर

X1 <- c("AC", "AC", "AC", "CA", "TA", "AT", "CC", "CC") 
X2 <- c("AC", "AC", "AC", "CA", "AT", "CA", "AC", "TC") 
X3 <- c("AC", "AC", "AC", "AC", "AA", "AT", "CC", "CA") 
mydf1 <- data.frame(X1, X2, X3) 

इनपुट डेटा फ्रेम

X1 X2 X3 
1 AC AC AC 
2 AC AC AC 
3 AC AC AC 
4 CA CA AC 
5 TA AT AA 
6 AT CA AT 
7 CC AC CC 
8 CC TC CA 

समारोह

# Function 
atgc <- function(x) { 
xlate <- c("AA" = 11, "AC" = 12, "AG" = 13, "AT" = 14, 
"CA"= 12, "CC" = 22, "CG"= 23,"CT"= 24, 
"GA" = 13, "GC" = 23, "GG"= 33,"GT"= 34, 
"TA"= 14, "TC" = 24, "TG"= 34,"TT"=44, 
"ID"= 56, "DI"= 56, "DD"= 55, "II"= 66 
) 
    x = xlate[x] 
} 
outdataframe <- sapply (mydf1, atgc) 
outdataframe 
    X1 X2 X3 
AA 11 11 12 
AA 11 11 12 
AA 11 11 12 
AG 13 13 12 
CA 12 12 11 
AC 12 13 13 
AT 14 11 12 
AT 14 14 14 

समस्या, एसी से 12 में eaqual नहीं है उत्पादन के बजाय 11, इसी तरह दूसरों के लिए। बस गड़बड़!

(exta: इसके अलावा मैं नहीं जानता कि rownames से छुटकारा पाने के लिए कैसे।)

+2

आपके लिए सबसे आसान समाधान केवल 'x = xlate [x] 'to x = xlate [as.character (x)]' संपादित करना हो सकता है, क्योंकि यह थोड़ा सा त्रुटि उत्पन्न कर रहा है। ('X' वर्ग 'कारक' के वैक्टर हैं, और इंडेक्सिंग में कारक के पूर्णांक मान (संबंधित चरित्र तारों के बजाए) का उपयोग किया जा रहा है।) –

+2

इसके अलावा, राउनम्स से छुटकारा पाने के लिए, बस 'राउननाम' (mydf) <- NULL'। –

उत्तर

4

बस apply का उपयोग करें और स्थानांतरित:

t(apply (mydf1, 1, atgc)) 

sapply का उपयोग करने के लिए, तो या तो उपयोग:

  1. stringsAsFactors=FALSE अपना डेटा फ्रेम बनाते समय, यानी

    mydf1 <- data.frame(X1, X2, X3, stringsAsFactors=FALSE) 
    

    (धन्यवाद @joran) या

  2. बदलें करने के लिए अपने समारोह की अंतिम पंक्ति: x = xlate[as.vector(x)]

+0

मुझे लगता है कि अगर वे कारकों से बचने के लिए 'स्ट्रिंग्सएफ़ैक्टर्स = गलत' का उपयोग करते हैं तो मुझे लगता है कि 'sapply' काम करेगा, लेकिन मुझे लगता है कि यह शायद बेहतर है। – joran

+0

@ जॉन सीएलके, आप 'कार' पैकेज में 'रिकोड' फ़ंक्शन भी देख सकते हैं, जो मुझे लगता है कि आप अपने 'एटीजीसी' फ़ंक्शन को करना चाहते हैं। – BenBarnes

1

`मैच समारोह लक्ष्य मिलान वेक्टर वह यह है कि" चरित्र "के साथ कारक तर्क का उपयोग कर सकते कक्षा:

atgc <- function(fac){ c(11, 12, 13, 14, 
12, 22, 23, 24, 
13, 23, 33, 34, 
14, 24, 34,44, 
56, 56, 55, 66)[ 
match(fac, 
    c("AA", "AC", "AG", "AT", 
    "CA", "CC", "CG","CT", 
    "GA", "GC", "GG","GT" , 
    "TA", "TC", "TG","TT", 
    "ID", "DI", "DD", "II")) 
       ]} 
#The match function returns an index that is designed to pull from a vector. 
sapply(mydf1, atgc) 
    X1 X2 X3 
[1,] 12 12 12 
[2,] 12 12 12 
[3,] 12 12 12 
[4,] 12 12 12 
[5,] 14 14 11 
[6,] 14 12 14 
[7,] 22 12 22 
[8,] 22 24 12 
0

इस तरह, आपको केवल मैट्रिक्स में प्रत्येक व्यक्तिगत अक्षर के लिए प्रतिस्थापन मूल्यों को आपूर्ति करना होगा, बिना दोबारा जांच के एके सुनिश्चित करें कि आप सभी संयोजनों पर विचार करते हैं और उन्हें सही तरीके से मेल खाते हैं, हालांकि आपके उदाहरण के साथ संयोजन सीमित हैं।

मान और उनके विकल्प के साथ सूची निर्धारित करें:

trans <- list(c("A","1"),c("C","2"),c("G","3"),c("T","4"), 
    c("I","6"),c("D","5")) 

का उपयोग कर gsub()

atgc2 <- function(myData, x) gsub(x[1], x[2], myData) 

(प्रतिस्थापित मूल्यों के साथ एक मैट्रिक्स बनाएं इस मामले में प्रतिस्थापन समारोह को परिभाषित करें, एक मैट्रिक्स लौटे करने mydf1 परिवर्तित gsub() के लिए इच्छित वैल्यू वैल्यू, लेकिन आप यह जांचना चाहेंगे कि यह आगे बढ़ने से पहले किसी भी अन्य डेटा के साथ काम करता है)

mymat <- Reduce(atgc2, trans, init = as.matrix(mydf1)) 

mymat में मूल्यों जिसमें वे मूल रूप दिखाई दिया, तो "AC" = "12" और "CA" = "21" क्रम में अभी भी कर रहे हैं, इसलिए उन्हें पुन: व्यवस्थित (और उन्हें संख्यात्मक मान में बदलने का)

ansVec <- sapply(strsplit(mymat, split = ""), 
    function(x) as.numeric(paste0(sort(as.numeric(x)), collapse = ""))) 

वस्तु ansVec एक है वेक्टर, तो इसे वापस एक डेटा में परिवर्तित करें।फ्रेम

(mydf2 <- data.frame(matrix(ansVec, nrow = nrow(mydf1)))) 
# X1 X2 X3 
# 1 12 12 12 
# 2 12 12 12 
# 3 12 12 12 
# 4 12 12 12 
# 5 14 14 11 
# 6 14 12 14 
# 7 22 12 22 
# 8 22 24 12 

इस स्थिति के लिए, अन्य उत्तर निश्चित रूप से तेज़ हैं। हालांकि, चूंकि प्रतिस्थापन संचालन अधिक जटिल हो जाते हैं, मुझे लगता है कि यह समाधान कुछ लाभ प्रदान कर सकता है। इस विधि को संबोधित करने वाले पहलुओं में से एक, हालांकि, "ATT" और "TTG" दोनों के लिए स्ट्रिंग "ATTGCG" की जांच करेगा।

0

दरअसल, मुझे लगता है कि आप अपने मूल वैक्टरों को कारकों के रूप में प्रस्तुत करना चाहते हैं, क्योंकि वे मनमाना चरित्र मूल्यों के बजाय स्तरों (डीएनए डिन्यूक्लियोटाइड) के सीमित सेट का प्रतिनिधित्व करते हैं।

lvls = c("AA", "AC", "AG", "AT", "CA", "CC", "CG", "CT", "GA", "GC", 
     "GG", "GT", "TA", "TC", "TG", "TT", "ID", "DI", "DD", "II") 
X1 <- factor(c("AC", "AC", "AC", "CA", "TA", "AT", "CC", "CC"), levels=lvls) 
X2 <- factor(c("AC", "AC", "AC", "CA", "AT", "CA", "AC", "TC"), levels=lvls) 
X3 <- factor(c("AC", "AC", "AC", "AC", "AA", "AT", "CC", "CA"), levels=lvls) 
mydf1 <- data.frame(X1, X2, X3) 

इसी तरह, "11" एक कारक का स्तर है, न कि संख्या ग्यारह। तो स्तरों के बीच एक मानचित्रण,

xlate <- c("AA" = "11", "AC" = "12", "AG" = "13", "AT" = "14", 
      "CA"= "12", "CC" = "22", "CG"= "23","CT"= "24", 
      "GA" = "13", "GC" = "23", "GG"= "33","GT"= "34", 
      "TA"= "14", "TC" = "24", "TG"= "34","TT"="44", 
      "ID"= "56", "DI"= "56", "DD"= "55", "II"= "66") 

और एक एकल चर

levels(X1) <- xlate 

करने के लिए 'फिर से स्तर' फिर से स्तर डेटा फ्रेम के सभी स्तंभों के लिए है

as.data.frame(lapply(mydf1, `levels<-`, xlate)) 

sapply का उपयोग करना उचित नहीं है, क्योंकि यह एक मैट्रिक्स (चरित्र का) बनाता है, भले ही आपने इसे outdataframe नाम दिया हो। भेद वास्तव में एसएनपी डेटा के लिए महत्वपूर्ण हो सकता है जो यह दर्शा सकता है, चूंकि मैट्रिक्स के रूप में 1000 के नमूने में लाखों एसएनपी लागू किए जाएंगे, सबसे लंबे समय तक वेक्टर आर स्टोर कर सकते हैं (मॉड्यूलो बड़े वेक्टर समर्थन में पेश किया जा रहा है आर-डेवेल), जबकि डेटा फ्रेम प्रत्येक के केवल लाखों तत्वों के वैक्टरों की एक सूची होगी।

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