2013-10-19 57 views
-1

我有一个很大的data.table值,我需要为每个县区域(CPA)按模式(TRANMOT)计算平均旅行时间(TRPDUR)。输出应该是一个表格,每个CPA作为一行,然后是非机动模式平均时间的列和机动模式平均时间的列。我想出了一个肮脏的方式做到这一点在两个独立的data.tables:按行值计算新的data.table列

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)进行子集化,就像我通过删除NAs所做的那样,但我希望表达式计算子集数据的平均值,而不是执行两次操作,然后删除行。

谢谢!

+2

你能给我们提供一些示例数据吗? –

回答

2

我想你想......

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

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

+0

它可以很好地处理一个奇怪的错误。出于某种原因,大约7行变成了我的代码中没有的NAs。我打算仔细研究一下这个问题,看看能不能找出差异,但是乐观无疑是正确的主意!谢谢。 – gren

+0

很酷。乐意效劳。我猜这种差异来自于此:用我的方法,有一个by = CPA,而你的是by = CPA,TRANMOT。对于我的,即使对于没有TRANMOT级别的CPA,结果也会返回,而您的结果仅返回观察到的CPA,TRANMOT对的结果。 – Frank

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 
      ] 
+0

你可以在'setNames'的第二个参数上使用粘贴来添加“Trip Time”位,对吧? – Frank

+0

当然,或者类似'paste0(“Motorized:”,x)''。尽管现在我想起它,setNames将在向量中而不是列表中命名。值得编辑... –