Soru:
R'de birden çok veri çerçevesini birleştirmenin etkili yolu
Anthony Kong
2011-08-16 12:49:37 UTC
view on stackexchange narkive permalink

Birkaç dosyanın içeriğini birleştirerek büyük bir veri çerçevesi oluşturuyorum. Bu dosyalar aynı sütun düzenini paylaşır.

  c = read.delim ('bigfile1.txt') c1 = read.delim ('bigfile2.txt') c2 = read.delim ('bigfile3 .txt ') ctmp1 = merge (c, c1, all = TRUE) ctmp2 = merge (ctmp1, c2, all = TRUE)  

Yukarıdaki kod verimli mi?

Bunun yerine aynı değişken adını yeniden kullanmalı mıyım, örneğin

  tmp = merge (c, c1, all = TRUE) tmp = merge (tmp, c2, all = TRUE)  
Ne tür bir verimlilik arıyorsunuz? Hız mı bellek kullanımı mı?
mptiktas: Güzel soru! Önce performans, ikinci olarak bellek ayak izi.
Bunun performans üzerinde ciddi bir etkisi olacağından şüpheliyim, ancak dosyaları bir listeye okur ve "do.call" aracılığıyla "birleştirmek" için "rbind" veya "cbind" kullanırdım. Bu şekilde etrafta fazladan nesneler kalmaz.
Şüphelendiğim gibi şeyler varsa (cevabıma bakın), dosyalara R dışında katılmak ve sonra onları okumaktan daha iyi olabilirsiniz: performans iyi olacak ve muhtemelen 1'den fazla dosyaya sahip olma ihtiyacından kaçınabilirsiniz ( aynı anda belleğe eklediğiniz dosya).
@Nick:, önerinize tamamen katılıyor. Bu özel durumda, sadece kaynak klasöre okuma erişimim var. Elbette, dosyaları yerel bir konuma gönderebilir ve onları bir araya getirebilirim.
Sorunuzu `` dput (head (c)) `,` dput (head (c1)) `,` dput (head (c2)) 'nin içeriğiyle güncelleyebilir misiniz, böylece insanlar cevaplarını çalışan gerçek kodla güncelleyebilirler? "En sevdiğimAraçToDoHipotetik Analizimi kontrol edin" referanslarının hiç kimse için bu kadar yapıcı olduğunu sanmıyorum. Bu yöntemleri iş başında görebilseydik çok daha ilginç bir oyun olurdu.
@chase: Bu komutları denedim. Özel bilgiler olan bazı temel verileri ortaya çıkaracağından, muhtemelen bunları buraya gönderemem.
Veri yapınızı kopyalayan bazı rastgele veriler oluşturmaya ne dersiniz? `rnorm ()`, `runif ()`, `sample ()`, vb. hepsi burada kullanılabilir. Esasen, "veriyi kontrol edin, bu tür şeyler için harika olduğunu duydum" dan daha ayrıntılı yanıtlar getirecek bir şey istiyorum ve tekrarlanabilir bir örnek, insanlara XYZ'nin ne kadar havalı olduğunu gösterme şansı verecektir.
@chase. İyi bir nokta. Bir şans vereceğim. Burada çaylak bu yüzden nefesini tutma. :-)
Beş yanıtlar:
#1
+12
Aaron left Stack Overflow
2011-08-16 23:53:08 UTC
view on stackexchange narkive permalink

Bunları R içinde şu şekilde kategorize edebilirsiniz:

  read.table (boru ("cat bigfile1.txt bigfile2.txt bigfile3.txt"))  
#2
+9
Nick Sabbe
2011-08-16 13:27:54 UTC
view on stackexchange narkive permalink

Aynı sütun düzenine sahip olduklarını belirttiğinize göre, muhtemelen üç (veya daha fazla) data.frame'in birbirinin altına eklenmesini istiyorsunuz, değil mi?

Bu durumda, rbind :

  cres = rbind (c, c1, c2)  

Ancak dikkatli olun: çok sayıda data.frame ile , Performansın subpar olduğunu fark ettim (bunun, data.frame'lerin sütun listeleri olarak bellek içinde yönetilme biçimiyle ilgisi var). Ayrıca, faktörlerle ilgili sorunlar olabilir: aynı sütun düzenine sahip olmak, ancak faktörler için farklı düzeylere sahip olmak bunu bozabilir (denemedim).

Not: Verilerinizin tamamı sayısal ise, önce her data.frame'i matrise dönüştürün, sonra bir rbind yapın ve sonucu tekrar bir data.frame'e dönüştürün.
#3
+3
Alex
2011-08-16 16:41:50 UTC
view on stackexchange narkive permalink

plyr paketinden rbind.fill'e göz atın. Geçenlerde Hadley'in verimli olduğu ancak bulamadığına dair yorumunu gördüm.

#4
+2
Zach
2011-08-16 18:39:11 UTC
view on stackexchange narkive permalink

Verimli ile "hızlı" demek istiyorsanız, data.table paketine bakın. Çok hızlı birleşme var.

#5
+2
Beta
2011-08-16 22:48:35 UTC
view on stackexchange narkive permalink

Join deyimini sqldf paketinde deneyebilirsiniz. Büyük veri kümelerinde SQL ile çalışmayı çok daha kolay buluyorum. Lütfen referans için buradaki bağlantıyı bulun



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...