2017-02-06 12 views
-3

.SDがどのように働いているのか心配していないため、ワークフローに統合できません。.SDはどのように内部的に動作しますか?

set.seed(10238) 
DT <- data.table(A = rep(1:3, each = 5), B = rep(1:5, 3), 
       C = sample(15), D = sample(15)) 

datatableはリストで、各列名は要素の名前であり、列はリストのベクトル要素です。したがって、式の中で列名を使用すると、その列のデータを表すベクトルとして見ることができます。したがって:

DT[, mean(B)] 
[1] 3 

しかし、キーワードbyが使用されている場合、それはトリッキーになることを開始します:byでグループ化するときにそれを体験する方法が行われていますか?

DT[, mean(B), by=A] 
    A V1 
1: 1 3 
2: 2 3 
3: 3 3 

DT[, print(B), by=A] 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 

ここでキーワードAは、Aにあるグループに基づいてベクトルBを3つのベクトルに分割するように見えます。それはベクトルのリストですか、それはデータテーブルですか、結果のデータテーブルはどのように再構築されますか?

> DT[, lapply(B, mean), by=A] 
    A V1 V2 V3 V4 V5 
1: 1 1 2 3 4 5 
2: 2 1 2 3 4 5 
3: 3 1 2 3 4 5 

私は、これが個々に3つのベクトルを供給されているようlapply DT[, mean(B), by=A]と同じ結果を返すことの意味を理解することができず、それらに意味適用する必要があり、結果のリストを見データテーブルに再構築されるべきです前。

最後に、私はいくつかの列のthheクラスを変換しているよ、私が使用する必要がなぜ、私は理解していない:

DT[, names(DT) := lapply(.SD, as.character)] 

とされていない:

DT[, names(DT) := lapply(DT, as.character)] 

それは同じである必要がありますlapplyはDTの各列にas.characterを適用し、列の後に同じ順序で名前が付けられた文字列のベクトルを含むリストを返します。

+1

'.SD'は、by(またはkeyby)で使用される列を除く、各グループの** S ** ubset of x's ** D ** ataを含むdata.tableです。 '?special-symbols'を参照してください。 – Jaap

答えて

4

ドキュメントに焦点を合わせると、より良いレセプションが得られます。

私はちょうど?.SDとタイプしました。ビネットへの最初の段落ポイント、提供定義ヤープ、および下部の例のセクションでは、この含まれていますので、

DT = data.table(x=rep(c("b","a","c"),each=3), v=c(1,1,1,2,2,1,1,2,2), y=c(1,3,6), a=1:9, b=9:1) 
DT 
X = data.table(x=c("c","b"), v=8:7, foo=c(4,2)) 
X 

DT[.N]         # last row, only special symbol allowed in 'i' 
DT[, .N]        # total number of rows in DT 
DT[, .N, by=x]       # number of rows in each group 
DT[, .SD, .SDcols=x:y]     # select columns 'x' and 'y' 
DT[, .SD[1]]       # first row of all columns 
DT[, .SD[1], by=x]      # first row of 'y' and 'v' for each group in 'x' 
DT[, c(.N, lapply(.SD, sum)), by=x] # get rows *and* sum columns 'v' and 'y' by group 
DT[, .I[1], by=x]      # row number in DT corresponding to each group 
DT[, .N, by=rleid(v)]     # get count of consecutive runs of 'v' 
DT[, c(.(y=max(y)), lapply(.SD, min)), 
     by=rleid(v), .SDcols=v:b]  # compute 'j' for each consecutive runs of 'v' 
DT[, grp := .GRP, by=x]    # add a group counter 
X[, DT[.BY, y, on="x"], by=x]   # join within each group 

を、英語または例と間違っている何を言うてください。あなたがそれを参照してドキュメントを読んだことを人々に伝え、人々に示します。最後の部分で

:最後に、私はいくつかの列のクラスを変換しているよ

私が使用する必要がなぜ、私は は理解していない:

DT[, names(DT) := lapply(.SD, as.character)] 

ありません。あなたはこのような場合にすることができます

DT[, names(DT) := lapply(DT, as.character)] 

。グループ化(by=またはkeyby=)がなく、iサブセットもないため、同じです。なぜあなたは最初のものを使わなければならないと思いますか?あなたは、あなたが読んだところを参照しないで、間違った足で始めます。この場合、.SDを使用するとDTの別の変数名の繰り返しが保存されるため、最初の方が好ましいです(一般的な原則はhereと説明されています)。メモリの効率が重要な場合、単純なforループは、最初に:=のRHS全体を作成することを回避します。 forループウェイは、列ごとに行います(詳細はhere)。

関連する問題