.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を適用し、列の後に同じ順序で名前が付けられた文字列のベクトルを含むリストを返します。
'.SD'は、by(またはkeyby)で使用される列を除く、各グループの** S ** ubset of x's ** D ** ataを含むdata.tableです。 '?special-symbols'を参照してください。 – Jaap