2013-10-18 18 views
6

Ben ben rbindlist istiyorum data.tables birkaç. Tablolar (muhtemelen eksik) seviyeleri olan faktörler içerir. rbind I seviyesini düşük tutmak istiyorsanızrbindlist

dt1 <- data.table(x=factor(c("a", "b"), levels=letters)) 

rbindlist(list(dt1, dt1))[,x] 
## [1] a b a b 
## Levels: a b 

do.call(rbind, list(dt1, dt1))[,x] 
## [1] a b a b 
## Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z 

, ben tor çare var mı ya da data.table yolu vardır: Sonra rbindlist(...)do.call(rbind(...)) farklı davranır? Ben rbindlist tahmin

+4

Her zaman 'rbindlist' aramadan önce seviyelerini yakalamaya, sonra (http://stackoverflow.com/questions/14634964/how (Onları geri koymak [buradan] görebilirsiniz))-a-faktörü-sütun-in-a-veri tablosunda -Hiç-on-değiştirme seviyeleri. Ama sanırım haklısın, "droplevels = TRUE" argümanı olmalı. – Justin

cevap

4

o niye bağlayıcı sonra düzeylerini belirlemek için değil do.call(rbind.data.frame,...)

kontrolünü yapmaz çünkü hızlıdır? ?setattr den

Dt <- rbindlist(list(dt1, dt1)) 
    setattr(Dt$x,"levels",letters) ## set attribute without a copy 

:

setattr(), referans ile bu özelliklerini ayarlamak için, birçok durumda kullanışlıdır ve bir nesne herhangi bir nesne ya da bir kısmı kullanılabilir, sadece data.tables değildir. Bu sorunu işaret için

+0

Teşekkürler. Ama bunu gerçekten kullandığım yerde seviyeleri bilmiyorum. I 2 'data.tables' varsa, zaten' düzeylerini saptamak ([x]))) dt (unlist (lapply (listesi (dt1, dt2), fonksiyon (dt) seviyeleri) 'benzersiz gerekir ve korkarım o zaman 'do.call (rbind, ...) 'sürümü daha hızlı olabilir. faktörleri sahip olmanın ne anlamı var - – shadow

+2

@shadow Sana sorardım bu durumda faktör seviyelerinin daha da büyük bir sayı ile satır çok fazla sayıda, varsa bu sadece daha yavaş olacak tahmin ediyorum? Ben sadece iç faktörleri kullanırsanız, bu son adımı hızlandırabiliyorsanız, – eddi

+1

fwiw tekrarı ile veri tekrar tekrar kullanılan ve tekrar tekrar kullanılan elemanların az sayıda olsaydı faktörleri kullanırdım yukarı biraz: 'do.call (data.table ::: c.factor, lapply (liste (dt1, dt2), "[[", 'x'))' senaryonuzdaki – eddi

2

teşekkürler. version 1.8.11 itibariyle sabit olmuştur:

dt1 <- data.table(x=factor(c("a", "b"), levels=letters)) 

rbindlist(list(dt1, dt1))[,x] 
#[1] a b a b 
#Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z