Data.table: [R-Forge#5222] DT [、list(sum(non-.SD-col)、lapply(.SD、mean))、by = ...、。SDcols = ...]の場合、「見つかりません」

作成日 2014年06月08日  ·  12コメント  ·  ソース: Rdatatable/data.table

提出者: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の投稿です。

High bug

全てのコメント12件

更新する別の投稿: 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。 私はこの修正を数年間待っていました。

驚くばかり! ありがとうございました

このページは役に立ちましたか?
0 / 5 - 0 評価