.SD

2013-07-02 19 views
5

ile lapply içindeki sütun adını geri alın. Data.table içindeki tüm sütuna bir işlev uygulamak istiyorum. Bu nedenle, ben depp ile .SD kullanıyorum. Ama, lapply içinde, masamın sütununu alamıyorum. .SD

x = data.table(a=1:10, b=10:1, id=1:5) 
x[,lapply(.SD,function(t){t*id}),.SDcols=c(1,2)] 
Error in ..FUN(a) : object 'id' not found 

Mesela

için

Ben aşağıdaki do: Biz daha iyi

x[,lapply(.SD,function(t){t*x$id}),.SDcols=c(1,2)] 

yapabilir mi?

cevap

4

.SDcols=c(1,2) ürününü kaldırma. O id yok üçüncü sütun (id)

> x[,lapply(.SD,function(t){t*id})] 
    a b id 
1: 1 10 1 
2: 4 18 4 
3: 9 24 9 
4: 16 28 16 
5: 25 30 25 
6: 6 5 1 
7: 14 8 4 
8: 24 9 9 
9: 36 8 16 
10: 50 5 25 

kaldırır, bütün şu çalışacaktır:

x[,lapply(.SD[,list(a,b)], `*`, id)] 

x[,lapply(.SD[,-3, with=F], `*`, id)] 

x[,lapply(.SD, `*`,id)][, list(a,b)] 
+1

Teşekkür! I sütununda işlevi uygulamaktan kaçınmanın bir yolu var mı? – Nicolas

+1

@Nicolas lütfen düzenlememi kontrol et. Küçük ipucu, hıza düşerseniz, fonksiyonunuzu her zaman en kompakt yapısını (çoğu zaman daha hızlı kod anlamına gelir) vermeyi deneyin. – Michele

+0

Verdiğiniz üç alternatiften ilkini beğeniyorum, ancak '.SD 'kullanılmaya başlandı. Bence x [, lapply (liste (a, b), '*, id)]' 'en iyi çözümdür ve' .SDcols'un kullanılmasından daha fazla yazmayı gerektirmez. –

İlgili konular