提出者:Matt Weller; 割り当て先:誰も; R-Forgeリンク
.SDcols
を使用する場合(複数の列に関数を適用する目的で)、次の構文を使用して元のテーブル(v1)の他の列を参照することはできません。
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp, :
# object 'v1' not found
リストの代わりにcを使用すると、同様のエラーが発生します。明らかに、 j
句内で列v1にアクセスできません。
lapply
部分に含めたくないのに、列v1を含む次のコードに頼り、計算後に削除する必要がありました。
sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Stackoverflowのeddiによると、これはバグであり、彼は私にそれを報告するように頼みました。 彼がどの部分をバグだと思っているのか正確にはわからないので、これ以上詳細を提供することはできません。アルンが受け入れた回答を見ると、その後の議論で問題がどこにあるのかが明らかになります。
これが関連するSOの投稿です。
更新する別の投稿: http :
少し遅れましたが、私のこの質問を山に追加し
私はそれをバグとは考えていませんでした。通常、 .SDcols
追加の必須フィールドを提供し、後でj
.SD[, !"total", with=FALSE]
を使用して不要な列を除外します。
これも良い回避策です。 dt$total
を使用した場合とのパフォーマンスの違いは疑問です。 そしてそうです、この種のダンスはFRとバグIMOの間の境界線を踊ります。
これをもう一度ぶつけます。 これは非常に重要な修正になる可能性があるようです。 この質問は関連しているようで、 DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]
介して解決できる可能性があります
これが役立つもう1つの簡単なケースは次のとおりです: http :
苦しんでいる別の単純なケースは次のとおりです: http :
修正時に更新する別の: http :
わーい! これを行うことができます:
require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# grp v1 v2 v3
# 1: 2 7 4.5 12.5
# 2: 3 12 4.0 13.0
# 3: 1 9 3.5 13.5
ここにリンクされているすべてのSO投稿を更新しました。 ありがとうございます。
ありがとう、@ arunsrinivasan。 私はこの修正を数年間待っていました。
驚くばかり! ありがとうございました