2010-02-03 13 views
38

Çok büyük ayrılmış veri dosyaları var ve Yalnızca belirli sütunları R'da işlemek için zaman ve bellek almadan data.frame için tüm dosya.Okuma yolları sadece bir dosyadan R? ("Read.table" ve "scan" arasındaki mutlu bir ortam?)

Bildiğim tek seçenek, yalnızca birkaç sütun veya scan istediğimde çok düşük görünen bir görüntü istediğimde çok israf olan read.table.

Saf R ile daha iyi bir seçenek var mı, yoksa sütun çıkarımı yapmak için başka bir kabuk komut dosyasını çağırıyor ve daha sonra çıktısında tarama veya read.table kullanıyor mu? (Hangi bir kabuk betiğini çağırıp R'de çıkışını yakalama sorusuna yol açar?).

+0

Burada bir dizi faydalı cevap. Bunlardan herhangi biri belirli bir bağlam için yararlı olacaktır. Kabul edilen kişi, gerçek durumuma en yakın olanıydı ve bir kod snippet'i içeriyordu. (Dirk'i seçmiş olabilirim, fakat çok fazla itibarı var gibi görünüyor ;-)) –

+6

En iyi cevap yeni soruda bulunuyor http://stackoverflow.com/q/5788117/168747 – Marek

cevap

34

:

df <- read.table(pipe("cut -f1,5,28 myFile.txt")) 

Bu, cut'un çok bellek kullanmadan yapabileceği veri seçimini yapmasına izin verir.

read.table için colClasses argüman "NULL" kullanılarak, saf R versiyonu için Only read limited number of columns bakınız.

+1

İlk örneğiniz, tam olarak kullandığım şeydir.(düzensiz bir ayrılmış dosya biçimi nedeniyle benim durumumda kesmek yerine awk). İkinci örneğiniz, benim anladığım kadarıyla eşdeğer değil. Tüm bu 'data.frame' sadece tekrar atmak için yaratmayacak mı? Bir milyon satırlık dosyadan 2 tane 10 sütun istediğimde, performansta büyük bir fark var. –

+11

Hayır, saf R eşdeğeri bir şey gibi olurdu (28 kolonu varsayarak) 'mycols <- rep (NULL, 28); mikenler [c (1,5,28)] <- NA; df <- read.table (dosya, colClasses = mycols) ' –

+1

@DirkEddelbuettel Ben sadece bunun üzerine çıktım. 'NULL' öğesinin tırnak içinde olması gerekiyor. – JackeJR

18

Bir olasılık, dosya adının yerine pipe() kullanmak ve awk veya benzer filtrelere sahip olmak, yalnızca istediğiniz sütunları ayıklamaktır.

pipe ve arkadaşları hakkında daha fazla bilgi için help(connection) adresine bakın.

Düzenleme: Eğer colClasses konuda çok açık olup olmadığını read.table() da sizin için yapabilir - Verilen sütun için NULL değeri alltogether sütunu atlar. Bkz help(read.table). Bu yüzden, ek paketler veya aletler olmaksızın R tabanına bir çözümümüz var.

7

Dirk'ün yaklaşımının hızlı olduğu kadar ileriye doğru olduğunu düşünüyorum. Kullandığım bir alternatif, read.table() 'dan daha hızlı bir şekilde MUCH yükleyen ve sonra sadece istediğiniz şeyi çıkaracak olan sqlite'a veri yüklemektir. sqldf() paketi bunu oldukça kolaylaştırıyor. Sqldf() için kod örnekleri veren bir önceki yığın taşması yanıtına Here's a link.

3

Bu gerekenden daha muhtemelen daha, ama çok büyük veri kümeleri üzerinde çalışan eğer o zaman da Hadoop kullanarak rutin bir harita-azaltmak sağlar the HadoopStreaming package bir göz olabilir.

7

Aradığınız tam olarak ne yapmak için tasarlanmış bir paket, colbycol vardır: Bazen bir sekme ile sınırlandırılmış dosyadaki verileri varken böyle bir şey yapmak

http://cran.r-project.org/web/packages/colbycol/index.html

+1

Aslında bu hala böyle görünüyor tüm sütunları işler, ancak bellek kısıtlamaları olmadan. Biraz farklı bir bağlamda çok yararlı olabilir. –

+2

Bu paket artık CRAN'da geçerli değildir. –