2015-04-20 5 views
7

मैं निम्नलिखित है data.frameका मेल (चिपकाने) स्तंभों

Tipo Start End Strand Accesion1 Accesion2 
1 gene 197 1558  +  <NA> SP_0001 
2 CDS 197 1558  + NP_344554  <NA> 
3 gene 1717 2853  +  <NA> SP_0002 
4 CDS 1717 2853  + NP_344555  <NA> 
5 gene 2864 3112  +  <NA> SP_0003 
6 CDS 2864 3112  + NP_344556  <NA> 

ऐसे tRNA, क्षेत्र, एक्सॉन, या rRNA रूप में और अधिक "टिपो" मूल्यों, कर रहे हैं, लेकिन मैं केवल इन दो के संयोजन में दिलचस्पी है , जीन और सीडीएस

और मैं निम्नलिखित

Start End Accesion1 Accesion2 
1 197 1558 NP_344554 SP_0001 

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

+1

आप थोड़ा अधिक जानकारी प्रदान करने के लिए, चाहे के बारे में आवश्यकता हो सकती है 'जीन/CDS' नहीं जोड़े में होता है या। यह अस्पष्ट है क्योंकि आपने बताया कि अन्य मूल्य 'टीआरएनए, क्षेत्र, एक्सोन' इत्यादि हैं मान लीजिए, यदि 'df1 $ प्रारंभ करें [6] <- 2 9 64 'उदाहरण डेटासेट – akrun

+0

उदाहरण के लिए अपेक्षित परिणाम क्या होगा, वे जोड़े में आते हैं आपके द्वारा दिया गया समाधान बहुत अच्छा काम करता प्रतीत होता है। चूंकि कुछ अतिरिक्त टिपो मौजूद हैं, कुछ एनए दिखाई देते हैं, लेकिन मैं उन्हें आसानी से पूर्ण.cases से हटा सकता हूं, मैं dplyr के साथ समाधान ढूंढ रहा था, सिर्फ इसलिए कि मैं इसे प्यार करता हूं। लेकिन समाधान (आप मिटा दिया?) अच्छी तरह से काम करता है –

+1

क्या आप यह जांच सकते हैं कि यह 'लाइब्रेरी (डेटा.table); setDT (df1) [, id: = cumsum (tipo ==' gene ')] [, सूची (Accesion1 = na.omit (Accesion1) है, Accesion2 = na.omit (Accesion2)), सूची (आईडी, स्टार्ट, एंड)] ' – akrun

उत्तर

4

एक dplyr संस्करण:

DF %>% 
    group_by(Start, End) %>% 
    summarise_each(funs(max), Accesion1, Accesion2) 

का उत्पादन:

Source: local data frame [3 x 4] 
Groups: Start 

    Start End Accesion1 Accesion2 
1 197 1558 NP_344554 SP_0001 
2 1717 2853 NP_344555 SP_0002 
3 2864 3112 NP_344556 SP_0003 

मान लिया गया AccessionX varibles शर्त के रूप में, चरित्र (कारक के साथ काम नहीं करता है) कर रहे हैं और साथ ही है कि स्टार्ट एंड जोड़े में केवल दो मान होते हैं, जो आपके डेटा सेट में टिपो और जीन में से प्रत्येक होते हैं।

+0

मुझे नहीं पता क्यों, लेकिन मुझे यह नहीं मिला। एक sapply (डीएफ, कक्षा) मुझे बताता है कि Accesion1 और 3 चरित्र हैं। लेकिन मैं मिलता है इस प्रारंभ समाप्ति Accesion1 Accesion2 1 197 1558 NA NA 2 1717 2853 NA NA 3 2864 3112 NA NA 4 3196 4311 NA NA 5 4382 4951 NA NA 6 4952 8461 NA NA 7 8519 8785 NA एनए 8 8778 9146 NA NA 9 9151 9273 NA NA 10 9266 10534 NA NA –

+1

मुझे लगता है कि 'summarise_each (funs (अधिकतम = अधिकतम (।, na.rm = TRUE)), Accesion1, Accesion2)' – akrun

+0

जरूरत हो सकती है हां, अक्रुन, आप ठीक हैं –

3

से छुटकारा पाने के लिए यहाँ एक समाधान aggregate() का उपयोग कर रहा है:

df <- data.frame(Tipo=c('gene','CDS','gene','CDS','gene','CDS'), Start=c(197,197,1717,1717,2864,2864), End=c(1558,1558,2853,2853,3112,3112), Strand=c('+','+','+','+','+','+'), Accesion1=c(NA,'NP_344554',NA,'NP_344555',NA,'NP_344556'), Accesion2=c('SP_0001',NA,'SP_0002',NA,'SP_0003',NA)); 
df2 <- df[df$Tipo%in%c('gene','CDS'),c('Start','End','Accesion1','Accesion2')]; 
aggregate(df2[,c('Accesion1','Accesion2')], df2[,c('Start','End')], function(x) x[!is.na(x)]); 
## Start End Accesion1 Accesion2 
## 1 197 1558 NP_344554 SP_0001 
## 2 1717 2853 NP_344555 SP_0002 
## 3 2864 3112 NP_344556 SP_0003 

Precomputing df2 में आवश्यक है मामले में मूल डेटा में गैर-जीन गैर-सीडीएस पंक्तियां हैं। फ्रेम; जीन और सीडीएस पंक्तियों को सही ढंग से एकत्रित करने के लिए, गैर-जीन गैर-सीडीएस पंक्तियों को x और by दोनों से बाहर रखा जाना चाहिए। (बेशक, अपने उदाहरण डेटा केवल जीन और सीडीएस पंक्तियों, तो यह नहीं तकनीकी रूप से उदाहरण डेटा के लिए आवश्यक है है।)

यह समाधान धारणा है कि जब भी दो पंक्तियों में एक ही Start और End मान हो, तो वे होना चाहिए बनाता है जीन/सीडीएस जोड़े (जीन/जीन या सीडीएस/सीडीएस के विपरीत)।

+0

का एक डुप्लिकेट टिप्पणी के लिए धन्यवाद। मैंने सभी मामलों के लिए अपना समाधान नहीं देखा क्योंकि ओपी ने इसका उल्लेख किया है (टिप्पणियों के आधार पर)। – akrun

+0

मुझे यह उत्तर भी पसंद है। धन्यवाद –

2

यहां एक संभावित तरीका है। आप जीन और सीडीएस के साथ पंक्तियों का चयन करते हैं। फिर, आप प्रारंभ और अंत तक अपना डेटा समूहित करते हैं। 1 या 3+ पंक्तियों के साथ START/END के समूह हो सकते हैं। तो आप यह सुनिश्चित करना चाहते हैं कि आप दो पंक्तियों के साथ START/END समूह चुनें। इसके अतिरिक्त, आप यह सुनिश्चित करना चाहते हैं कि आपके पास जीन और सीडीएस (length(unique(Tipo)) == 2) दोनों हों। अंत में, आप Accesion1 और accesion 2.

में गैर एनए तत्व ले
filter(df, Tipo %in% c("gene", "CDS")) %>% 
group_by(Start, End) %>% 
filter(n() == 2 & length(unique(Tipo)) == 2) %>% 
summarise(Accesion1 = Accesion1[!is.na(Accesion1)], 
      Accesion2 = Accesion2[!is.na(Accesion2)]) 

यहाँ एक छद्म उदाहरण है। summarize_each साथ

mydf <- structure(list(Tipo = structure(c(2L, 1L, 2L, 1L, 2L, 2L), .Label = c("CDS", 
"gene"), class = "factor"), Start = c(197, 197, 1717, 1717, 2864, 
2864), End = c(1558, 1558, 2853, 2853, 3112, 3112), Strand = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = "+", class = "factor"), Accesion1 = structure(c(NA, 
1L, NA, 2L, NA, 3L), .Label = c("NP_344554", "NP_344555", "NP_344556" 
), class = "factor"), Accesion2 = structure(c(1L, NA, 2L, NA, 
3L, NA), .Label = c("SP_0001", "SP_0002", "SP_0003"), class = "factor")), .Names = c("Tipo", 
"Start", "End", "Strand", "Accesion1", "Accesion2"), row.names = c(NA, 
-6L), class = "data.frame") 


    Tipo Start End Strand Accesion1 Accesion2 
1 gene 197 1558  +  <NA> SP_0001 
2 CDS 197 1558  + NP_344554  <NA> 
3 gene 1717 2853  +  <NA> SP_0002 
4 CDS 1717 2853  + NP_344555  <NA> 
5 gene 2864 3112  +  <NA> SP_0003 
6 gene 2864 3112  + NP_344556  <NA> 


filter(mydf, Tipo %in% c("gene", "CDS")) %>% 
group_by(Start, End) %>% 
filter(n() == 2 & length(unique(Tipo)) == 2) %>% 
summarise(Accesion1 = Accesion1[!is.na(Accesion1)], 
      Accesion2 = Accesion2[!is.na(Accesion2)]) 

# Start End Accesion1 Accesion2 
#1 197 1558 NP_344554 SP_0001 
#2 1717 2853 NP_344555 SP_0002 
+0

@akrun मैं थोड़ा जंगली रहा हूँ। मुझे आश्चर्य है कि ऊपर दिया गया उदाहरण आपके बिंदु को स्पष्ट करता है। अगर मुझे आपकी बात याद आ रही है तो कृपया मुझे बताएं। – jazzurro

+1

हां, यह मेरे बिंदु – akrun

+0

को स्पष्ट करता है क्या इसका मतलब यह है कि मेरे डेटा.फ्रेम में कारक होना चाहिए? मेरा वास्तव में कारक नहीं है। यह एक सादा डेटा है। फ्रेम, और आपका कोड काम नहीं कर रहा है। –

4

आप की कोशिश कर सकते

library(data.table) 
setDT(df1)[, id:=cumsum(Tipo == 'gene')][, 
    list(Accesion1=na.omit(Accesion1), Accesion2=na.omit(Accesion2)) , 
           list(id, Start, End)] 
संबंधित मुद्दे