[解決済み] 変数名が文字ベクトルで格納されている場合のdata.tableへの選択と代入
質問
の中でどのように変数を参照するのですか?
data.table
の中で、変数名が文字ベクトルに格納されている場合、どのように参照するのでしょうか?例えば、これは
data.frame
:
df <- data.frame(col1 = 1:3)
colname <- "col1"
df[colname] <- 4:6
df
# col1
# 1 4
# 2 5
# 3 6
これと同じ操作をdata.tableに対して行うにはどうしたらよいでしょうか。
:=
の記法の有無にかかわらず、data.table に対して同じ操作を行うにはどうしたらよいでしょうか。明らかなのは
dt[ , list(colname)]
は機能しません(期待もしていませんでした)。
どのように解決するのですか?
プログラムによる2つの方法 を選択する 変数を選択する方法です。
-
with = FALSE
:DT = data.table(col1 = 1:3) colname = "col1" DT[, colname, with = FALSE] # col1 # 1: 1 # 2: 2 # 3: 3
-
'ドットドット' (
..
) の接頭辞があります。DT[, ..colname] # col1 # 1: 1 # 2: 2 # 3: 3
ドットドット」のさらなる記述については、(
..
) 記法については
1.10.2での新機能
を参照してください (現在、ヘルプテキストでは説明されていません)。
への
を割り当てる
のLHSを変数に代入します。
:=
を括弧で囲む。
DT[, (colname) := 4:6]
# col1
# 1: 4
# 2: 5
# 3: 6
後者はカラムと呼ばれる
ポンポン
と呼ばれ、列ベクトル全体を参照で置き換えるからです。もしサブセット
i
が存在すれば、それは参照によってサブアサインされます。 を囲む括弧は
(colname)
は、2014年10月CRAN上のバージョンv1.9.4で導入された略記法です。以下は
は、ニュース項目
:
使用方法
with = FALSE
と
:=
を包むことは、すべての場合において非推奨となりました。
のLHSを
:=
のLHSを括弧で囲むことが以前から好まれていたことを考えると、すべてのケースで非推奨となります。
colVar = "col1"
DT[, (colVar) := 1] # please change to this
DT[, c("col1", "col2") := 1] # no change
DT[, 2:4 := 1] # no change
DT[, c("col1","col2") := list(sum(a), mean(b))] # no change
DT[, `:=`(...), by = ...] # no change
参照
詳細
セクションの
?`:=`
:
DT[i, (colnamevector) := value]
# [...] The parens are enough to stop the LHS being a symbol
そして、コメントでのさらなる質問に答えるために、ここに一つの方法があります(いつものように、多くの方法があります):
DT[, colname := cumsum(get(colname)), with = FALSE]
# col1
# 1: 4
# 2: 9
# 3: 15
にしておけば、読み書きやデバッグが楽になるかもしれません。
eval
a
paste
というように、サーバーに送信する動的な SQL 文を作成するのと同じです。
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
# [1] "DT[,col1:=cumsum(col1)]"
eval(parse(text=expr))
# col1
# 1: 4
# 2: 13
# 3: 28
もし、そのようなことを頻繁に行うのであれば、ヘルパー関数として
EVAL
:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
# col1
# 1: 4
# 2: 17
# 3: 45
では、その
data.table
1.8.2 は自動的に
j
を効率よく使うように最適化します。
eval
メソッドを使うのが望ましいかもしれません。この場合
get()
で
j
は、例えばいくつかの最適化を阻止します。
あるいは、そこに
set()
. 低オーバーヘッドで機能的な形式である
:=
という形で、ここでは問題ないでしょう。参照
?set
.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT
# col1
# 1: 4
# 2: 21
# 3: 66
関連
-
RStudio の "plot.new() : figure margins too large" 問題を解決する。
-
ggplot2 からグリッドと背景色を削除する。
-
R言語 - マトリックス
-
[解決済み] ggplot2 の軸ラベルを回転させ、間隔を空ける
-
[解決済み] Rで2つのグラフを同じプロットで表示する
-
[解決済み] 空のdata.frameを作成する
-
[解決済み] ベクトル中のxの値を持つ要素の個数を数える
-
[解決済み] データフレーム内の列を名前でドロップする方法
-
[解決済み] データフレームのカラムのデータ型を決定する
-
[解決済み] データフレームの列を$と文字値で動的に選択する
最新
-
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 read.table Error:埋め込まれたヌルが含まれているようです。
-
[解決済み] lm.fit(x,y,offset = offset, singular.ok,...) 0 非NAケースでboxcox式で計算するとエラーになる。
-
[解決済み] HTML、PDF、DOCXで見栄えのするシンプルな手動のRMarkdownテーブル
-
[解決済み] Rの再現性のある優れた例題の作り方
-
[解決済み] パッケージ 'xxx' は利用できません (for R version x.y.z) 」という警告にどのように対処したらよいですか?
-
[解決済み] 非常に大きなテーブルをデータフレームとして高速に読み込む
-
[解決済み] Rでロードされているパッケージのバージョンを調べるには?
-
[解決済み】Rスクリプトで警告をグローバルに抑制する方法
-
[解決済み] data.tableで変数を使ってカラム名を渡す[重複]。