28

data.table参照によって新しい列を割り当てた後、新しいdata.tableを出力しないようにする方法はありますか?私は標準的な動作を収集します

library(data.table)
example(data.table)
DT
#    x y  v
# 1: a 1 42
# 2: a 3 42
# 3: a 6 42
# 4: b 1 11
# 5: b 3 11
# 6: b 6 11
# 7: c 1  7
# 8: c 3  8
# 9: c 6  9

DT[,z:=1:nrow(DT)]

#    x y  v z
# 1: a 1 42 1
# 2: a 3 42 2
# 3: a 6 42 3
# 4: b 1 11 4
# 5: b 3 11 5
# 6: b 6 11 6
# 7: c 1  7 7
# 8: c 3  8 8
# 9: c 6  9 9

つまり、テーブルは割り当て後に画面に印刷されます。新しい列zを割り当てた後、data.tableが新しいテーブルを表示しないようにする方法はありますか?私は言うことによってこの行動を止めることができることを知っています

DT <- copy(DT[,z:=1:nrow(DT)])

:=しかし、それは(コピーを避けるように設計されている)の目的を破っています。

4

2 に答える 2

30

<-.data.tableコピーを作成しないので、次を使用できます<-

data.tableオブジェクトを作成します。

library(data.table)
di <- data.table(iris)

新しい列を作成します。

di <- di[, z:=1:nrow(di)]
di

#       Sepal.Length Sepal.Width Petal.Length Petal.Width Species  z
#  [1,]          5.1         3.5          1.4         0.2  setosa  1
#  [2,]          4.9         3.0          1.4         0.2  setosa  2
#  [3,]          4.7         3.2          1.3         0.2  setosa  3
#  [4,]          4.6         3.1          1.5         0.2  setosa  4
#  [5,]          5.0         3.6          1.4         0.2  setosa  5
#  [6,]          5.4         3.9          1.7         0.4  setosa  6
#  [7,]          4.6         3.4          1.4         0.3  setosa  7
#  [8,]          5.0         3.4          1.5         0.2  setosa  8
#  [9,]          4.4         2.9          1.4         0.2  setosa  9
# [10,]          4.9         3.1          1.5         0.1  setosa 10
# First 10 rows of 150 printed. 

Rは、インタラクティブモードでオブジェクトの値のみを出力することも覚えておく価値があります。

したがって、バッチモードでは、次のように簡単に使用できます。

di[, z:=1:nrow(di)]

バッチモードでスクリプトとして実行した場合、これは出力を生成しません。


Matthew Dowleからの詳細情報:

FAQ2.21および2.22も参照してください。

2.21なぜDT[i,col:=value]全体を返すのDTですか?表示される値がない(と一致する<-)か、更新された行数を含むメッセージまたは戻り値のいずれかを期待していました。データが実際に参照によって更新されているかどうかは明らかではありません。

複合構文が機能するように。例:DT[i,done:=TRUE][,sum(done)]。更新された行数は、クエリごとに、またはを使用してグローバルに冗長性がオンになっている場合に返されますoptions(datatable.verbose=TRUE)

2.22わかりましたが、の戻り値はDT[i,col:=value]目に見えない形で返されませんか?

  • しようとしましたが、Rは内部的に可視性を強制し[ます。FunTabのeval列(src / main / names.cを参照)の値は、[force onを0意味 R_Visibleします(R-Internalsセクション1.6を参照)。したがって、 自分自身を直接試しinvisible()たり設定したりすると、src / main/eval.cで強制的に再度オンになります。R_Visible0eval
  • この振る舞いに慣れた後、あなたはそれを好むようになるかもしれません(私たちは持っています)。結局のところ、を使用してサブ割り当てし<-、すぐにデータを調べて問題がないことを確認するのは何回ですか?
  • データを返す:=aにミックスすることもできます。j混合更新と1つのクエリで選択します。j更新だけで(そしてそれから熱心に振る舞う)混乱する可能性があるかどうかを検出すること。

Matthew Dowleからの2番目の更新:

これで解決策が見つかり、v1.8.3を使用しても結果が出力されなくなりました:=。FAQ2.21および2.22を更新します。

于 2012-07-06T09:35:02.267 に答える
0

非常に長いデータテーブル名の場合、以下はパフォーマンスが同等であり、短くなる可能性があるようです(私は短い名前を好みますが、オブジェクトに実際に含まれているものを覚えるために長い名前が必要になる場合があります)。

invisible(Very.Long.Data.Table[i,col:=value])

と比べて:

Very.Long.Data.Table<-Very.Long.Data.Table[i,col:=value]

于 2020-02-21T09:35:49.993 に答える