[解決済み] data.tableで:=演算子はいつ使うべきですか?
2023-03-30 10:41:02
質問
data.table
オブジェクトに:=演算子が追加されました。 この演算子は他のすべての代入演算子と何が違うのでしょうか? また、どのような用途があり、どのくらい速くなるのか、そしてどのような場合に避けるべきなのでしょうか?
どのように解決するのですか?
10分を1秒に縮める例です(NEWSより
ホームページ
). これは、サブアサインされた
data.frame
にサブアサインするようなものですが、毎回テーブル全体をコピーするわけではありません。
m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
system.time(for (i in 1:1000) DF[i,1] <- i)
user system elapsed
287.062 302.627 591.984
system.time(for (i in 1:1000) DT[i,V1:=i])
user system elapsed
1.148 0.000 1.158 ( 511 times faster )
を置くことで
:=
に
j
のようにすると、より多くのイディオムが可能になります。
DT["a",done:=TRUE] # binary search for group 'a' and set a flag
DT[,newcol:=42] # add a new column by reference (no copy of existing data)
DT[,col:=NULL] # remove a column by reference
とする。
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
を避ける理由は思いつきません。
:=
! の内部で
for
のループになります。から
:=
の中に現れるからです。
DT[...]
の中に表示される場合、このような小さなオーバーヘッドが発生します。
[.data.table
メソッドの小さなオーバーヘッドが発生します。 例えば、S3 のディスパッチや引数の存在と種類のチェックなどです。
i
,
by
,
nomatch
などです。つまり、内部では
for
ループの内部では、オーバーヘッドが少なく、直接的なバージョンである
:=
と呼ばれる
set
. 参照
?set
を参照してください。の欠点は
set
には
i
は行番号でなければならず (バイナリサーチ不可)、また
by
. これらの制限を設けることで
set
にすることで、オーバーヘッドを劇的に減らすことができます。
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
関連
-
Rの警告 "条件の長さが1より大きいので、最初の要素しか使えない "に対する解決策
-
[解決済み] Rの再現性のある優れた例題の作り方
-
[解決済み] Rの代入演算子"="と"<-"の違いは何ですか?
-
[解決済み] 関数のソースコードを見るにはどうしたらいいですか?
-
[解決済み] データフレームのリストを行単位で1つのデータフレームに結合する
-
[解決済み] Rで文字列から最後のn文字を抽出する
-
[解決済み】data.table vs dplyr:一方がうまくできない、またはうまくできないことを行うことができますか?
-
[解決済み】サブセットされたデータフレーム内の未使用の因子レベルを削除する
-
[解決済み】data.tableが他のdata.tableの参照である場合(コピーである場合)を正確に理解する。
-
[解決済み] data.tableにキーを設定する目的は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R - よくあるエラーとその原因 - 注意事項
-
[解決策】 plot.new() のエラー:図の余白が大きすぎる。
-
[R] is.data.frame(x) のエラー : (リスト) オブジェクトを 'double' 型に強制できない。
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] Rの%*%の意味 [重複]について
-
[解決済み] xkcd風のグラフを作るには?
-
[解決済み] 情報を損なわずに因数を整数値に変換するには?
-
[解決済み] リストやデータフレームの要素にアクセスするためのブラケット[ ]とダブルブラケット[[ ]]の違いについて
-
[解決済み】Rのセッションで使用可能なメモリを管理するトリック
-
[解決済み] 2012年、なぜpythonのpandasマージはRのdata.tableマージより速かったのか?