按行值计算新的data.table列

时间:2013-10-19 04:26:38

标签: r data.table

我有一个大的data.table值,我需要计算每个县区(CPA)的模式(TRANMOT)的平均旅行时间(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的某些值的平均值。 This post显示如何对整个data.table(i)进行子集化,就像删除NA一样,但是我希望表达式计算子集数据的平均值,而不是执行两次操作,然后删除行。

谢谢!

2 个答案:

答案 0 :(得分:2)

我想你想......

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

它可能不会很快,但这样的事情应该有用。

答案 1 :(得分: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
          ]