2013-10-19 77 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將在向量中而不是列表中命名。值得編輯... –