2016-04-09 33 views
0

kendim R programları yazmaya hala yeni ama bu yapmak istediğim şudur:2 dosya nasıl eşleştirilir ve R'de döngüler varsa gerekli veriler nasıl alınır?

DF1:

Chr Start End Region 
chr6 3324 3360 Region1 
chr4 2445 2455 Region2 
chr1 1034 1090 Region4 

DF2 (Referans):

Site Chr  Location Gene  
Site1 chr4 2447  GeneB 
Site2 chr9 1153  GeneT 
Site3 chr6 3350  GeneM 
Site4 chr1 1034  GeneC 
Site5 chr1 2000  GeneU 
Site6 chr6 3359  GeneF 
Site7 chr7 1158  GeneI 
Site8 chr4 2451  GeneO 
Site9 chr6 3367  GeneZ 

İstiyorum DataFrame DF1 ürünümüzü aşağıdaki ölçütlere göre referans DF2'ye göre not et.

1) En önemlisi, ilk kural, "Chr" öğesinin "Chr" referansıyla eşleşmesidir. 2) Eşleşirse, referans DataFrame2'deki "Site" nin "Konumu", DataFrame1'in "Başlat" ve "Son" değerleri arasında olmalıdır.

Yani DF3 benim sonuçta aşağıdaki gibi görünmelidir:

DF3 (DF1 Extention)

Chr Start End Region  Site Gene 
chr6 3324 3360 Region1 Site3 GeneM 
chr6 3324 3360 Region1 Site6 GeneF 
chr4 2445 2455 Region2 Site1 GeneB 
chr4 2445 2455 Region2 Site8 GeneO 
chr1 1034 1090 Region4 Site4 GeneC 

Yani Bölgeler sahip oldukları sitelerin sayısına bağlı olarak ek satırları olsun.

Aşağıdaki gibi bir şey yaptım, ancak başarılı olmadı.

check <- match(DF1$Chr, DF2$CHR, nomatch=0); 
funtion_try <- for (i in DF2$Site) { 
if (check > 0 && DF2$Location => DF1$Start && DF1$MAPINFO =< dmr$End) 
DF3 <- data.frame (Chr, Start, End, DMR, Site, Gene); 
write.table (DF3, file="DF3.txt", sep="\t") } 

Herhangi bir yardım için teşekkür ederiz. Şimdiden teşekkürler! Bu yardımcı olacağını umuyoruz

+0

Bu, döngü içinde ne olacağı gözüküyor. Bütün kodu buraya koymalısın. Bütün kod buysa, o zaman sorunlardan en az biri. –

+0

Katılıyorum .. Bunu hala farklı yollarla deniyorum, ancak çok fazla hata alıyorum. Bu yüzden gösterilecek belirli bir kodum yok. Bu, az çok denediğim şey. Tabi ki DF3 <- data.frame (Chr, Start, End, DMR, Site, Gene); farklı yazılmalıdır. Bu işi almak için bazı ipuçları almak istiyorum ya da aşağıdaki kod için kaba bir düzenleme yapabilirsiniz. – Letin

+0

Oh Ne demek istediğini anladım. Bu bir bütün kod. Döngü "(DF2 $ Sitede i)" için başlar. {".. – Letin

cevap

2

, Veri Tablo ile

dplyr::filter(merge(df1, df2, by='Chr'), Location >= Start, Location <= End) 

: data.table güncel devel sürümünde

dt <- data.table(merge(df1, df2, by='Chr')) 
dt[Location >= Start & Location <= End] 
+0

Yazım düzeltmelerinden sonra başarılı olur. –

+0

Teşekkürler TheRimalaya. Bunun işe yarayacağını düşünüyorum, ama şimdi gördüğüm tek hata şu "Hata: yanlış uzunluk (0), bekliyor: 144970".Çünkü bu 2 veri karesi farklı uzunluktaki satırlara sahiptir. – Letin

+0

Bu rahatsız etmemelidir, birleştirme işlevi – TheRimalaya

1

, non-equi uygulanmaktadır birleşimler. Talimatları here izleyerek yükleyebilirsiniz. Bunun üzerine, bu oldukça verimli şöyle yapılabilir:

setDT(DF2)[DF1, .(Chr, Start, End, Region, Site, Gene), on = .(Chr, Location>=Start, Location<=End)] 
#  Chr Start End Region Site Gene 
# 1: chr6 3324 3360 Region1 Site3 GeneM 
# 2: chr6 3324 3360 Region1 Site6 GeneF 
# 3: chr4 2445 2455 Region2 Site1 GeneB 
# 4: chr4 2445 2455 Region2 Site8 GeneO 
# 5: chr1 1034 1090 Region4 Site4 GeneC 

Chr üzerinden birleştirmek yalnız gereksiz kombinasyonları sadece bir sonraki adımda onları filtrelemek için yaratır. Ancak eşdeğeri olmayan birleştirmeleri, eşleşen girişler için doğrudan görünür (dolayısıyla, hem hız hem de bellek açısından verimlilik).