1. ホーム
  2. r

[解決済み] data.tableの指定された列全てに関数を適用し、参照により更新する。

2023-02-14 10:34:06

質問

data.tableで、ある列に対して同じ処理を行いたい。 これらの列の名前は、文字ベクトルで与えられます。この特定の例では、私はこれらの列のすべてに-1を掛けたいと思います。

いくつかのおもちゃのデータと関連する列を指定するベクトルです。

library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")

今はこのように、文字ベクトルをループさせるようにしています。

for (col in 1:length(cols)) {
   dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}

forループを使わずに直接やる方法はないでしょうか?

どのように解決するのですか?

これは動作するようです。

dt[ , (cols) := lapply(.SD, "*", -1), .SDcols = cols]

結果は

    a  b d
1: -1 -1 1
2: -2 -2 2
3: -3 -3 3

ここにはいくつかのトリックがあります。

  • には括弧があるので (cols) := で指定されたカラムに割り当てられます。 cols という名前の新しい変数に代入されます。
  • .SDcols は、これらのカラムだけを見ていることを呼び出しに伝え、そのために .SD を使うことができます。 S のサブセットです。 D を設定します。
  • lapply(.SD, ...).SD を操作します。これはカラムのリストです(全ての data.frames と data.tables のようなものです)。 lapply はリストを返すので、最終的に j は次のように見える。 cols := list(...) .

EDIT : これは、@Arunが言及したように、おそらくより高速な別の方法です。

for (j in cols) set(dt, j = j, value = -dt[[j]])