データテーブルを要約して、元のデータの列名と値の組み合わせから生じる多くの新しい変数を作成したいと思います。これは、簡潔にするために2つの列で達成したい結果を示す再現可能な例です。
library(data.table)
data('mtcars')
setDT(mtcars)
# Desired output
mtcars[, .(
acm_hp_carb2 = mean(hp[which( carb <= 2)], na.rm=T),
acm_wt_am1 = mean(wt[which( am== 1)], na.rm=T)
), by= .(cyl, gear)]
多くの列を要約する必要があるため、各要約変数の作成に使用するすべての文字列を返す関数を作成しました。この例では、次のようになります。
a <- 'acm_hp_carb2 = mean(hp[which( carb <= 2)], na.rm=T)'
b <- 'acm_wt_am1 = mean(wt[which( am== 1)], na.rm=T)'
そして、これが私たちの失敗した試みです。作成された新しい列には、割り当てたい名前が付けられていないことに注意してください。
mtcars[, .(
eval(parse(text=a)),
eval(parse(text=b))
), by= .(cyl, gear)]
動作していない部分は列名だけのようです。a
とb
をベクトルに入れて名前を追加すると、を使用lapply
しeval(parse
てベクトルから名前を保持できます。正規表現を使用して名前を取得しましたが、おそらく実際のコードでは、最初に文字列を作成するために使用している変数として名前を割り当てることができます。
結果には多くのNaNがありますが、目的の出力と一致します。
to_make <- c(a, b)
to_make <- setNames(to_make, sub('^(.*) =.*', '\\1', to_make))
mtcars2[, lapply(to_make, function(x) eval(parse(text = x)))
, by= .(cyl, gear)]
# cyl gear acm_hp_carb2 acm_wt_am1
# 1: 6 4 NaN 2.747500
# 2: 4 4 76.0 2.114167
# 3: 6 3 107.5 NaN
# 4: 8 3 162.5 NaN
# 5: 4 3 97.0 NaN
# 6: 4 5 102.0 1.826500
# 7: 8 5 NaN 3.370000
# 8: 6 5 NaN 2.770000
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加