6

いくつかの変数を data.table にまとめ、ワイド形式で出力し、おそらく変数ごとのリストとして出力したいと考えています。他のいくつかのアプローチではうまくいかなかったので、変数の名前を文字ベクトルとして指定して、外側のラップを実行しようとしました。with=FALSE を使用して、これらを渡したかったのです。

carsx=as.data.table(cars)
lapply( list(speed="speed",dist= "dist"), #error object 'ansvals' not found
    function(x)  carsx[,list(mean(x), min(x), max(x) ), with=FALSE ] ) 

これではうまくいかないので、lapply を使わずにもっとシンプルな方法を試してみました。

carsx[,list(mean("speed"), min("speed"), max("speed") ), with=FALSE ] #error object 'ansvals' not found

これもうまくいきません。このようなことをする方法はありますか?「with」のこの動作は必要ですか? (列を選択するためだけに言及していることは承知して?data.tableいますが、私の場合、それらも変換できると便利です)

with=FALSE の場合、j は選択する名前または位置のベクトルであり、data.frame と同様です。with=FALSE は、data.table で列を動的に選択するのに役立ちます。

編集私の目的は、さまざまな変数について、グループごとに幅広い形式で要約を取得することです。変数のリストについて、1つの変数に対してのみ機能する以下を拡張しようとしました。

carsx[,list(mean(speed), min(speed), max(speed) ) ,by=(dist>50)

残念なことに、他の質問を投稿させてくれません。そこで、次のような出力が必要だと説明しました。

lapply( list(speed="speed",dist= "dist"),
        function(x) do.call("as.data.frame", aggregate(cars[,x], list(class=cars$dist>50), FUN=summary) ) )

予想される出力は次のようになります。

$speed 
         V1       V2 V3
1: FALSE 12.96970  4 20
2:  TRUE 20.11765 14 25

$dist
         V1       V2 V3
1: FALSE 12.96970  4 20
2:  TRUE 20.11765 14 25
4

2 に答える 2

1

Svens の回答に基づいて構築すると、.SDcols、rbindlist、および外側と内側のラップリーの組み合わせがうまくいきました。.SDにアクセスするにはインナーラップが必要です。

lapply( list(speed="speed",dist= "dist"),
    function(x)  carsx[ , rbindlist(lapply(.SD, function(x) list(mean=mean(x), min=min(x), max=max(x)) )), 
                       .SDcols = x,by= (dist>50)] ) 

結果:

$speed
    dist     mean min max
1: FALSE 12.96970   4  20
2:  TRUE 20.11765  14  25

$dist
    dist     mean min max
1: FALSE 27.84848   2  50
2:  TRUE 72.35294  52 120
于 2014-11-11T08:25:18.327 に答える