3

data.tableRのパッケージでsplit-apply-combine戦略を使用する方法を探しています。

library(data.table)

# take a data.table object, return integer
func <- function(DT) 
{
   DT$a * DT$a
}

DT = data.table(
  a = 1:50
  # ... further fields here
  b = rep(1:10, 5)
)

# this obviously won't work:
DT[, result:=func, by=b]

# but this will (based on @Aruns answer below)
DT[, result:=func(.SD), by=b]

これは非常に単純で、構造がより複雑ですが、すべてのフィールド名を登録しなくても、data.tableロジックを関数に抽出し、サブセットを関数に送信できるようにしたいと思います。data.table

4

1 に答える 1

9

編集:data.tableのプロジェクトwikiで利用可能なより詳細なHTMLビネットをチェックしてください。

さて、同等性を示すためにplyr使用する方法の小さな比較を示しましょう。data.table多分それはあなたが始めるのを助けるでしょう。ただし、data.tableのこの非常に優れた紹介このFAQを読むことが重要です。

set.seed(45) # for reproducibility
# dummy data
m  <- matrix(10*sample(15, 100, replace=T), ncol=10) # 100*10 matrix
df <- data.frame(grp = sample(1:10, 100, replace = T))
df <- cbind(df, as.data.frame(m))

11列、10データ、1グループ化列のdata.frameがあります。ここで、各グループ内のこれらの各列の平均を取りたい場合は、を使用してplyr、次のようにします。

require(plyr)
ddply(df, .(grp), function(x) colMeans(x[, 2:11]))

を使用してdata.table、を使用できます(ドキュメントのリンクを読むことに加えて、この投稿.SDをチェックして、何であるかについてのわかりやすい説明を確認してください)。.SD

require(data.table)
dt <-data.table(df, key="grp")
dt[, lapply(.SD, mean), by=grp]

これで始められると思います。

于 2013-02-23T21:52:19.053 に答える