-1

我有一个大的数据值表,我需要按模式 (TRANMOT) 计算每个县区 (CPA) 的平均行程时间 (TRPDUR)。输出应该是一个表格,每个 CPA 为一行,然后是非机动模式的平均时间一列,机动模式的平均时间为一列。我想出了一个肮脏的方法来做这两个单独的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]

这不是一个很好的方法,我相信我可以在一张桌子上做。当我将我的表达式 (j) 设为两列的列表时,我无法弄清楚如何仅计算 TRANMOT 某些值的平均值。 这篇文章展示了如何像我一样通过删除 NA 来对整个 data.table (i) 进行子集化,但我希望表达式计算子集数据的平均值,而不是执行两次操作然后删除行。

谢谢!

4

2 回答 2

2

我想你想要...

trip_dat[!is.na(TRPDUR),lapply(
  c("Motorized","Non-Motorized"),
  function(x) mean(TRPDUR[TRANMOT==x])
),by='CPA']

它可能不会很快,但这样的事情应该可以工作。

于 2013-10-19T07:37:03.103 回答
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 回答