[解決済み] data.tableで:=を使用してグループ別に複数のカラムを割り当てる
2022-04-26 16:57:05
質問
を使用して複数のカラムに割り当てる最良の方法は何ですか?
data.table
? 例えば
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
次のようなことをしたいのですが(もちろんこの構文は間違っています)。
x[ , (col1, col2) := f(), by = "id"]
さらに、それを拡張して、変数に格納された名前を持つ多くのカラムを持つことができます(例えば
col_names
)を行いたい。
x[ , col_names := another_f(), by = "id", with = FALSE]
このような場合、どのようにするのが正しいのでしょうか?
どのように解決するのですか?
R-Forgeのv1.8.3では動作するようになりました。ご指摘ありがとうございます。
x <- data.table(a = 1:3, b = 1:6)
f <- function(x) {list("hi", "hello")}
x[ , c("col1", "col2") := f(), by = a][]
# a b col1 col2
# 1: 1 1 hi hello
# 2: 2 2 hi hello
# 3: 3 3 hi hello
# 4: 1 4 hi hello
# 5: 2 5 hi hello
# 6: 3 6 hi hello
x[ , c("mean", "sum") := list(mean(b), sum(b)), by = a][]
# a b col1 col2 mean sum
# 1: 1 1 hi hello 2.5 5
# 2: 2 2 hi hello 3.5 7
# 3: 3 3 hi hello 4.5 9
# 4: 1 4 hi hello 2.5 5
# 5: 2 5 hi hello 3.5 7
# 6: 3 6 hi hello 4.5 9
mynames = c("Name1", "Longer%")
x[ , (mynames) := list(mean(b) * 4, sum(b) * 3), by = a]
# a b col1 col2 mean sum Name1 Longer%
# 1: 1 1 hi hello 2.5 5 10 15
# 2: 2 2 hi hello 3.5 7 14 21
# 3: 3 3 hi hello 4.5 9 18 27
# 4: 1 4 hi hello 2.5 5 10 15
# 5: 2 5 hi hello 3.5 7 14 21
# 6: 3 6 hi hello 4.5 9 18 27
x[ , get("mynames") := list(mean(b) * 4, sum(b) * 3), by = a][] # same
# a b col1 col2 mean sum Name1 Longer%
# 1: 1 1 hi hello 2.5 5 10 15
# 2: 2 2 hi hello 3.5 7 14 21
# 3: 3 3 hi hello 4.5 9 18 27
# 4: 1 4 hi hello 2.5 5 10 15
# 5: 2 5 hi hello 3.5 7 14 21
# 6: 3 6 hi hello 4.5 9 18 27
x[ , eval(mynames) := list(mean(b) * 4, sum(b) * 3), by = a][] # same
# a b col1 col2 mean sum Name1 Longer%
# 1: 1 1 hi hello 2.5 5 10 15
# 2: 2 2 hi hello 3.5 7 14 21
# 3: 3 3 hi hello 4.5 9 18 27
# 4: 1 4 hi hello 2.5 5 10 15
# 5: 2 5 hi hello 3.5 7 14 21
# 6: 3 6 hi hello 4.5 9 18 27
を使用した旧バージョン。
with
引数を使用します (この引数は可能な限り使用しないようにします)。
x[ , mynames := list(mean(b) * 4, sum(b) * 3), by = a, with = FALSE][] # same
# a b col1 col2 mean sum Name1 Longer%
# 1: 1 1 hi hello 2.5 5 10 15
# 2: 2 2 hi hello 3.5 7 14 21
# 3: 3 3 hi hello 4.5 9 18 27
# 4: 1 4 hi hello 2.5 5 10 15
# 5: 2 5 hi hello 3.5 7 14 21
# 6: 3 6 hi hello 4.5 9 18 27
関連
-
R言語 - マトリックス
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] データフレーム列の名前によるドロップ
-
[解決済み] Pythonのdictをdataframeに変換する
-
[解決済み】pandasでカラムの種類を変更する
-
[解決済み】data.table vs dplyr:一方がうまくできない、またはうまくできないことを行うことができますか?
-
[解決済み] FUN内のlapplyインデックス名へのアクセス
-
[解決済み] 大規模なdata.tableのNAを置換する最速の方法
最新
-
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:埋め込まれたヌルが含まれているようです。
-
[解決済み] Rの二乗偏差の総和の算出
-
[解決済み] HTML、PDF、DOCXで見栄えのするシンプルな手動のRMarkdownテーブル
-
[解決済み] 文字列ベクトルを代入して、列名を持つ空のデータフレームを作成する?重複
-
[解決済み] R:自然対数を使った方程式をnlsで使う
-
[解決済み] ggplot2 の軸ラベルを回転させ、間隔を空ける
-
[解決済み] なぜ `[`] は `subset` よりも優れているのですか?
-
[解決済み】RでCRANミラーを選択する方法
-
[解決済み] ggplot2 で個々のファセットにテキストをアノテートする