[解決済み] 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]])
関連
-
Rでエラー:単項演算子への引数が無効
-
R言語における共通関数
-
[解決済み] グループ化関数(tapply、by、aggregate)と*applyファミリ
-
[解決済み] 関数のソースコードを見るにはどうしたらいいですか?
-
[解決済み] 統計的最頻値の求め方は?
-
[解決済み] データフレームのリストを行単位で1つのデータフレームに結合する
-
[解決済み】data.frameのグループごとの平均値【重複】について
-
[解決済み】安定したマッピングを持つggplot2のカテゴリ変数に色を割り当てるには?
-
[解決済み] データフレームのカラムのデータ型を決定する
-
[解決済み] 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 - よくあるエラーとその原因 - 注意事項
-
R言語ダウンロード機能 download.fileとダウンロード解析
-
[解決済み] HTML、PDF、DOCXで見栄えのするシンプルな手動のRMarkdownテーブル
-
[解決済み] Rで文字列から文字を削除する
-
[解決済み] パッケージ 'xxx' は利用できません (for R version x.y.z) 」という警告にどのように対処したらよいですか?
-
[解決済み] require()とlibrary()の違いは何ですか?
-
[解決済み] ベクトル中のxの値を持つ要素の個数を数える
-
[解決済み] data.frameの1つの列の名前を変更する方法は?
-
[解決済み] ベクトル中のある要素のインデックスを求めるR関数はありますか?
-
[解決済み] Rでオブジェクト(変数)が定義されているかどうかを確認するには?