data.table
グループごとの行のサブセット化
サーチ…
備考
注意: DT[where, select|update|do, by]
構文は、data.tableの列を操作するために使用されます。
- "where"部分が
i
引数です。 - "select | update | do"部分は
j
引数です
これらの2つの引数は、通常、名前ではなく位置によって渡されます。
各グループ内の行の選択
# example data
DT <- data.table(Titanic)
各性別について、生存数が最も高い行が必要であるとします。
DT[Survived == "Yes", .SD[ N == max(N) ], by=Sex]
# Class Sex Age Survived N
# 1: Crew Male Adult Yes 192
# 2: 1st Female Adult Yes 140
.SD
は各Sex
関連するデータのサブセットです。これをさらに条件設定の行にサブセット化しています。スピードが重要な場合は、代わりにSODのeddiが提案するアプローチを使用してください 。
DT[ DT[Survived == "Yes", .I[ N == max(N) ], by=Sex]$V1 ]
# Class Sex Age Survived N
# 1: Crew Male Adult Yes 192
# 2: 1st Female Adult Yes 140
落とし穴
コードの最後の行では、 .I
は完全なdata.tableの行番号を参照します。しかし、 何も存在しないとき、これは真実ではないby
。
DT[ Survived == "Yes", .I]
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
DT[ Survived == "Yes", .I, by=Sex]$I
# 17 18 19 20 25 26 27 28 21 22 23 24 29 30 31 32
グループの選択
# example data
DT = data.table(Titanic)
2番目のクラスだけを見たいとします。
DT[ Class == "2nd" ]
# Class Sex Age Survived N
# 1: 2nd Male Child No 0
# 2: 2nd Female Child No 0
# 3: 2nd Male Adult No 154
# 4: 2nd Female Adult No 13
# 5: 2nd Male Child Yes 11
# 6: 2nd Female Child Yes 13
# 7: 2nd Male Adult Yes 14
# 8: 2nd Female Adult Yes 80
ここでは、 i
、where句を使用してデータを単純にサブセット化します。
条件でグループを選択する
# example data
DT = data.table(Titanic)
大多数が生き残った場合にのみ各クラスを見たいとします。
DT[, if (sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) .SD, by=Class]
# Class Sex Age Survived N
# 1: 1st Male Child No 0
# 2: 1st Female Child No 0
# 3: 1st Male Adult No 118
# 4: 1st Female Adult No 4
# 5: 1st Male Child Yes 5
# 6: 1st Female Child Yes 1
# 7: 1st Male Adult Yes 57
# 8: 1st Female Adult Yes 140
ここでは、条件が満たされている場合に限り、データ.SD
のサブセットを返します。代わりに
DT[, .SD[ sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) ], by=Class]
しかしこれは時々より遅いことが判明しています。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow