2015-04-20 35 views
7

ben şu var data.framebirleştiren (yapıştırma) sütunlarına

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> 

Orada böyle tRNA, bölge, ekson veya rRNA gibi daha "Tipo" değerler vardır, ama bu ikisini birleştiren tek ilgileniyorum gen ve CDS

ve

Start End Accesion1 Accesion2 
1 197 1558 NP_344554 SP_0001 

ama başlangıç ​​ve sonu geninin değerler ve CDS tuttuğu takdirde aşağıdaki almak istiyorum. Ben seçeneğini kullanmak düzenlemek ve dplyr ile mutasyona denedim ama bana ilgi UA

+1

'gen/CDS' çiftler halinde veya olmasın deneyebilirsin. Eğer df1 $ Başlangıç ​​[6] <- 2964' ise örnek verisi – akrun

+0

için beklenen sonuç ne olurdu, varsayalım. Verdiğiniz çözüm çok iyi çalışıyor gibi görünüyor. Bazı ekstra Tipo mevcut olduğu için, bazı NA görünür, ama ben kolayca onları ile atabilirsiniz Ben dplyr ile bir çözüm arıyordum, sadece onu seviyorum çünkü. Ama çözüm (sildiniz mi?) güzel çalışır –

+1

Bu çalışıp çalışmadığını denetler misiniz kitaplık (data.table); setDT (df1) [, id: = cumsum (Tipo == 'gen')] [, liste (Accesion1 = na.omit (Accesion1), Accesion2 = na.omit (Accesion2)), liste (id, Başlat, Son)] ' – akrun

cevap

4

A dplyr sürümü:

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

üretir:

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 Değişkenler koşulu, hem de karakter (faktörü ile çalışmaz) olduğunu kabul olduğunu Başlangıç ​​Bitiş çiftleri, veri kümenizde olduğu gibi yalnızca iki değer, biri Tipo ve Gen'den oluşur.

+0

Neden bilmiyorum ama anlamadım. bir sapply (df, sınıf) Accesion1 ve 3 karakter olduğunu söyler. Ama olsun bu Başlangıç ​​Bitiş 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 NA 8 8778 9146 NA NA 9 9151 9273 NA NA 10 9266 10534 NA NA –

+1

bence 'summarise_each (funs (maks = maksimum (., na.rm = TRUE)), Accesion1, Accesion2) ' – akrun

+0

gerekli olabilir Evet, akrun, hepiniz haklısınız –

3

kurtulmak için Buraya aggregate() kullanarak bir çözüm tür karmaşıktır:

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 gereklidir orjinal data.frame'de gen olmayan CDS olmayan satırlar var ise; Sadece gen ve CDS satırlarını düzgün bir şekilde toplamak için, gen olmayan CDS olmayan satırların her ikisi de x ve by'dan hariç tutulmalıdır. (Bu örnek veriler için teknik olarak yansıttığı görünüyorsa Elbetteki kendi örnek veri, sadece gen ve CDS satır var.)

Bu çözüm iki satır aynı Start ve End değerlere sahip olduğunda, o zaman olmalıdır varsayım yapar gen/CDS çiftleri (gen/gen veya CDS/CDS'nin aksine).

+0

kopyası var Yorum için teşekkürler. OP'den de bahsettiği gibi (yorumlara dayanarak) tüm davalar için çözümümü kontrol etmedim. – akrun

+0

Bu cevabı çok beğeniyorum. Teşekkürler –

2

İşte olası bir yol. Gen ve CDS ile satırları seçersiniz. Ardından, verilerinizi Start ve END ile gruplandırırsınız. 1 veya 3+ satır içeren START/END grupları olabilir. Yani, iki satırlı START/END gruplarını seçtiğinizden emin olmak istersiniz. Ayrıca, hem gen hem de CDS (length(unique(Tipo)) == 2) olduğundan emin olmak istersiniz. Son olarak,

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)]) 

İşte sahte örnektir Accesion1 ve üyeliğiyle 2.

olmayan NA eleman alır. summarize_each ile

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 Biraz paslı oldum. Yukarıdaki örneğin amacını açıklığa kavuşturacağını merak ediyorum. Eğer noktanı kaçırıyorsam lütfen bana bildirin. – jazzurro

+1

Evet, bu noktada açıkladığım nokta – akrun

+0

Bu, data.frame öğesinin şunları içermesi gerektiği anlamına mı geliyor? Benimki aslında faktör içermiyor. Bu düz bir data.frame ve kodunuz çalışmıyor. –

4

Sen

library(data.table) 
setDT(df1)[, id:=cumsum(Tipo == 'gene')][, 
    list(Accesion1=na.omit(Accesion1), Accesion2=na.omit(Accesion2)) , 
           list(id, Start, End)] 
Sen olmadığı konusunda, biraz daha ayrıntı gerekebilir