-1

値の大きな data.table があり、郡域 (CPA) ごとにモード (TRANMOT) ごとの平均移動時間 (TRPDUR) を計算する必要があります。出力は、各 CPA を行とし、非電動モードの平均時間の列と電動モードの平均時間の列を含む 1 つのテーブルにする必要があります。私は2つの別々のdata.tablesでそれを行う汚い方法を思いつきました:

mot_table <- nomot_table <- data.table(trip_dat)
mot_table <- mot_table[!is.na(TRPDUR), list("Motorized Trip Time" = mean(TRPDUR)), keyby = list(CPA, TRANMOT)][TRANMOT == "Motorized"][,TRANMOT:=NULL]
nomot_table <- nomot_table[!is.na(TRPDUR), list("Non-Motorized Trip Time" = mean(TRPDUR)), keyby = list(CPA, TRANMOT)][TRANMOT == "Non-Motorized"][,TRANMOT:=NULL]

それは美しい方法ではありませんが、1 つのテーブルで実行できると確信しています。式 (j) を 2 つの列のリストにすると、TRANMOT の特定の値についてのみ平均を計算する方法がわかりません。 この投稿では、NA を削除して data.table (i) 全体をサブセット化する方法を示しますが、操作を 2 回行ってから行を削除するのではなく、式でサブセット データの平均を計算する必要があります。

ありがとう!

4

2 に答える 2

0

data.tableキャストやメルトなどの再形成機能がすぐに追加されると思います。

を使用するreshape2と、このようなものになります。魔法を使用しないdata.tableため、非常に大きなオブジェクトの場合、これは失敗する可能性があります。後で列名を変更する必要があります。

new <- mot_table[!is.na(TRPDUR), 
          mean(TRPDUR), 
          keyby = list(CPA, TRANMOT)
         ]
new <- dcast(TRANMOT ~ CPA, data = new, value.var = V1)

純粋に を使用してdata.table、おそらくこのインラインのようなものです。後で列名を変更する必要があります。

new <- mot_table[!is.na(TRPDUR), 
          mean(TRPDUR), 
          keyby = list(CPA, TRANMOT)
         ][, setNames(lapply(unique(TRANMOT), 
                    function(x) {
                      V1[which(TRANMOT == x)]
                    }, paste0("Motorized: ", unique(TRANMOT))),
           by = CPA
          ] 
于 2013-10-19T21:18:43.123 に答える