data.table
列の追加と変更
サーチ…
備考
公式のビネット、 "参照セマンティクス"は、このトピックのベストイントロダクションです。
注意: DT[where, select|update|do, by]
構文は、data.tableの列を操作するために使用されます。
- "where"部分が
i
引数です。 - "select | update | do"部分は
j
引数です
これらの2つの引数は、通常、名前ではなく位置によって渡されます。
列の変更はすべてj
で行うことができます。さらに、この機能ではset
関数を使用できます。
値の編集
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
列の編集
新しい列を作成したり既存の列を変更するには、 j
中で:=
演算子を使用します。
DT[, mpg_sq := mpg^2]
行のサブセットでの編集
i
引数を使用して、行の部分集合を「編集」する場所を指定します。
DT[1:3, newvar := "Hello"]
data.frameの場合と同様に、行番号または論理テストを使用してサブセット化することができます。また、[need_a_link]を変更するときにi
[join]を使うこともできます。
列の削除
NULL
設定して列を削除する:
DT[, mpg_sq := NULL]
我々はしていないことに注意してください<-
以来、その結果を割り当てるDT
その場で修正されています。
複数の列を編集する
:=
演算子の多変量形式を使用して複数の列を追加する:
DT[, `:=`(mpg_sq = mpg^2, wt_sqrt = sqrt(wt))]
# or
DT[, c("mpg_sq", "wt_sqrt") := .(mpg^2, sqrt(wt))]
.()
構文は、 LHS := RHS
の右側が列のリストである場合に使用されます。
複数の逐次依存列の編集
列が依存していて、順番に定義する必要がある場合は、次のような方法があります。
DT[, c("mpg_sq", "mpg2_hp") := .(temp1 <- mpg^2, temp1/hp)]
# or
DT[, c("mpg_sq", "mpg2_hp") := {temp1 = mpg^2; .(temp1, temp1/hp)}]
動的に決定された名前で列を編集する
動的に決定される列名の場合は、かっこを使用します。
vn = "mpg_sq"
DT[, (vn) := mpg^2]
set
を使う
ほとんどの場合、オーバーヘッドを少し減らすためにset
を使用して列を変更することもできます。
set(DT, j = "hp_over_wt", v = mtcars$hp/mtcars$wt)
列の並び替え
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
列の順序を並べ替えるには、 setcolorder
使用します。たとえば、それらを逆にする
setcolorder(DT, rev(names(DT)))
これは、data.table内の列ポインタのリストを単に置換するだけであるため、パフォーマンスの面でほとんど何も必要ありません。
列の名前の変更
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
列の名前を変更するには(データを同じにしたまま)、新しい名前の列にデータをコピーして古い列を削除する必要はありません。代わりに、
setnames(DT, "mpg_sq", "mpq_squared")
参照によって元の列を変更します。
因子レベルおよび他の列属性の変更
# example data
DT = data.table(iris)
因子レベルを参照で変更するには、 setattr
使用します。
setattr(DT$Species, "levels", c("set", "ver", "vir")
# or
DT[, setattr(Species, "levels", c("set", "ver", "vir"))]
2番目のオプションは、結果を画面に出力する場合があります。
setattr
では、 levels(x) <- lvls
実行するときに通常発生するコピーを避けますが、いくつかのチェックをスキップするので、レベルの有効なベクトルを割り当てるように注意することが重要です。