data.table
の複数の列に共通の機能を適用する質問によく似ています。.SDcols
answered thoroughly hereです。別の列(グループ内)に異なる機能を適用しながら、列のサブセット(.SDcols)に関数を適用
.SD
サブセットの一部ではない別の列に異なる機能を同時に適用したいという違いがあります。
dt = data.table(grp = sample(letters[1:3],100, replace = TRUE),
v1 = rnorm(100),
v2 = rnorm(100),
v3 = rnorm(100))
sd.cols = c("v2", "v3")
dt.out = dt[, list(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
次のエラー利回り:
Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,
: object 'v1' not found
v1
列が列のサブセットに含まれていないので、今これは理にかなっているが、私はこの問題を解決するために私の試みを表示するには、以下の簡単な例を投稿します最初に評価する必要があります。だから私は、列の私のサブセットに含めて更なる探求:
sd.cols = c("v1","v2", "v3")
dt.out = dt[, list(sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
今は、このエラーは発生しませんが、合計が列V1
に三度繰り返して、それは、(3グループの場合)9行を含む答えを提供し、すべての3つの列(期待しかし望まれないように)、以下に示すようV2
内に配置するための手段:
> dt.out
grp V1 V2
1: c -1.070608 -0.0486639841313638
2: c -1.070608 -0.178154270921521
3: c -1.070608 -0.137625003604012
4: b -2.782252 -0.0794929150464099
5: b -2.782252 -0.149529237116445
6: b -2.782252 0.199925178109264
7: a 6.091355 0.141659419355985
8: a 6.091355 -0.0272192037753071
9: a 6.091355 0.00815760216214876
策ソリューション2を使用すると明らかに
ステップ次のように列のサブセットのグループによってmean
を計算し、単一の列のグループによってsum
にそれを接合することで、複数の段階で問題を解決することが可能である:
dt.out1 = dt[, sum(v1), by = grp]
dt.out2 = dt[, lapply(.SD,mean), by = grp, .SDcols = sd.cols]
dt.out = merge(dt.out1, dt.out2, by = "grp")
> dt.out
grp V1 v2 v3
1: a 6.091355 -0.0272192 0.008157602
2: b -2.782252 -0.1495292 0.199925178
3: c -1.070608 -0.1781543 -0.137625004
イム必ずそれはかなり単純なことだI行方不明です。ご指導いただきありがとうございます。
最初の式がうまくいかないという事実はバグですので、マージ構文と実行可能な解決策のバグ報告 – eddi