j
コンポーネントへのアプローチはネイティブではありませんdata.table
-話す
data.tableの構文については、 data.table wikiを読む価値がありますが、そうではありません(パフォーマンスの観点から、使用data.frame
はひどいです!)。
この質問を参照することも できます。おそらく、使用方法j
と動作方法を理解し始めるでしょうlist
。
- data.table(またはそのグループ化されたサブセット)内で評価される式のリストを渡します
- これらは評価されていない式であり、( currentl)関数は、正しい環境(または、グループサブセット)内でこれらを適切に評価するため
[
に監視に依存しています。list
data.table
.SD
この呼び出しは機能します
dtb[,list(a = a+1, b = b + 1, c = c+1), by = id]
これもそうです(たまたまへの呼び出しである評価されていない式を渡すlist(...)
library(plyr) # for as.quoted
my_list <- as.quoted(paste('list(',paste(letters[1:3], '=', letters[1:3], '+1',collapse= ','),')'))[[1]]
my_list
## list(a = a + 1, b = b + 1, c = c + 1)
dtb[,eval(my_list), by = id]
lapply(.SD, a_function)
の呼び出しをと組み合わせて使用する可能性もあり.SDcols
ます。.SDcols
引数を使用すると、関数を評価する列名の文字列を渡すことができるため、これは機能します
dtb[, lapply(.SD,base::'+',1),by= id, .SDcols = c('a','b','c')]
また
dtb[,lapply(.SD, .Primitive('+'),1), by= id, .SDcols = c('a','b','c')]
data.tableが関数として見つからないため、base::'+'
または.Primitive('+')
の代わりに呼び出したことに注意してください'+'
'+'
ベンチマーク
これらのソリューションのベンチマーク
benchmark(
lstdt=dtb[ , flst(.SD), by=id],
dfdt=dtb[ , fdf(.SD), by=id],
lapplySD = dtb[, lapply(.SD,base::'+',1),by= id, .SDcols = c('a','b','c')],
lapplySD2 = dtb[, lapply(.SD,.Primitive('+'),1),by= id, .SDcols = c('a','b','c')]
just_list = dtb[,list(a = a+1,b=b+1,c=c+1),b=id],
eval_mylist = dtb[,eval(my_list),b=id],
replications=10^2
## test replications elapsed relative user.self
## 2 dfdt 100 0.36 4.000000 0.34
## 6 eval_mylist 100 0.09 1.000000 0.10
## 5 just_list 100 0.11 1.222222 0.10
## 3 lapplySD 100 0.14 1.555556 0.14
## 4 lapplySD2 100 0.11 1.1 0.11
## 1 lstdt 100 0.18 2.000000 0.17