2014-10-21 31 views
7

Daha önce data.frame bağlamında yazılmış bir projem var. Kalkış sürelerini iyileştirmek için bunun yerine data.table kullanmanın hızından yararlanmaya çalışıyorum. Benim metodolojim, çerçevelerde okuyan, tablolara dönüştüren, hesaplamaları yapan ve sonra karelere dönüşen sarıcı işlevleri oluşturmaktı. İşteData.table için Sarıcı işlevleri

FastAgg<-function(x, FUN, aggFields, byFields = NULL, ...){ 
    require('data.table') 
    y<-setDT(x) 
    y<-y[,lapply(X=.SD,FUN=FUN,...),.SDcols = aggFields,by=byFields] 
    y<-data.frame(y) 
    y 
} 

I having ... basit örneklerinden biri bu fonksiyon x çalıştıran bir tabloya dönüştürülür ve sonra ben data.frame gösterimi kullanılarak yazdım kod sonra satırları başarısız olmasıdır . Beslediğim data.frame'in çalışan işlev tarafından değiştirilmediğinden nasıl emin olurum?

+0

Vay, bunu yaparken bile orijinal verileri değiştirir.beklemediğim çerçeve: 'dat <- data.frame (a = 1); dat2 <- dat; setDT (dat2); is.data.table (dat); “Bana dürüst olmak için buggy görünüyor. – thelatemail

+0

"setDT" yerine "as.data.table" öğesini kullanın. – A5C1D2H2I1M1N2O1R2T1

+1

@AnandaMahto - işe yaramıyor. 'SetDT'yi topladım çünkü sorun çıkarmadan nesneyi değiştiriyor,' <-' benim örneğimde yapamayacağına ya da başka bir şey yapana kadar. – thelatemail

cevap

3

Sizin durumunuz için, data.table'u sadece bir işlevde değil, dışarıda kullanmanız önerilir.

Ancak, bunun gerçekleşmesi olası değilse, setDT + setDF kurulumunu öneririm. setDT'u işlev dışında kullanmanızı (ve data.table'ı girdi olarak sağla) - data.frame'inizi referans ile bir data.table'a dönüştürmesini ve ardından istediğiniz işlemleri tamamladıktan sonra setDF'u kullanabilirsiniz. sonucu setDF kullanarak bir data.frame dosyasına geri döndürün ve bunu işlevden döndürün. Bununla birlikte, setDT(x) yapılıyor x bir data.table için - referans olarak çalıştığından.

Bu ideal değilse, bir kopyasında çalıştığı için işlevinizin içinde as.data.table(.)'u kullanın. Ardından, elde edilen data.table dosyasını data.frame dosyasına dönüştürmek ve data.frame işlevinizden döndürmek için setDF()'u kullanabilirsiniz.

Bu işlevler yakın zamanda kullanıma sunulmuştur (çoğunlukla kullanıcı istekleri nedeniyle). Bu karışıklığı önleme fikri, shallow() işlevini dışa aktarmak ve kopyalanacak sütunlar gerektiren nesneleri takip etmektir ve hepsini dahili olarak (ve otomatik olarak) yapmaktır. Her şey şu anda çok erken aşamalarda. Yönetdiğimiz zaman bu yazıyı güncelleyeceğim.


Ayrıca ?copy, ?setDT ve ?setDF de bakabilirsiniz. Bu işlevin yardım sayfasında ilk paragraf:

data.table tabirle

, tüm set* fonksiyonları referans olarak onların girişi değiştirin. Yani, bir sütun kadar büyük olan geçici çalışma belleği dışında hiç bir kopya yapılmaz. Referans olarak girişi değiştiren diğer data.table operatörü :='dur. Diğer set* işlev data.table için aşağıdaki See Also bölümüne göz atın.

Ve setDT için örnek: (Buranın biraz daha iyi açıklanabilir itiraf rağmen)

set.seed(45L) 
X = data.frame(A=sample(3, 10, TRUE), 
     B=sample(letters[1:3], 10, TRUE), 
     C=sample(10), stringsAsFactors=FALSE) 

# get the frequency of each "A,B" combination 
setDT(X)[, .N, by="A,B"][] 

hiçbir atama yapar. setDF yılında

:

X = data.table(x=1:5, y=6:10) 
## convert 'X' to data.frame, without any copy. 
setDF(X) 

bu oldukça açık olduğunu düşünüyorum. Ama daha fazla netlik sağlamaya çalışacağım. Ayrıca, bu işlevleri belgelerde de en iyi nasıl kullanacağımı ekleyeceğim.

+0

Sadece öğrenme eğrisi daha az (bir SQL arkaplanından geliyor) ve hız çok daha iyi olduğu için, sadece data.table'ı kullanmak için önerilerinizi takdir edebilirim. Elbette, elbette, tüm projelerimin tüm kodlarımı yeniden yazmak zorunda kalmamayı anlayabileceğinden emin olabilirsiniz. :-P – Adam