2013-05-14 49 views
5

下面是我原始數據框的一小部分。我需要結合在特定季節重複特定id的行,其licvessel不同。通過結合我需要總和qttygrossTon合併行並總結其值

請以season 1998中的id 431爲例(*)。

season lic  id qtty vessel grossTon 
… 
1998 16350 431 40  435  57 
1998 16353 431 28  303  22.54 
… 

相同受試者431具有兩個不同的lic(16350 & 16353)和兩種不同的vessels(435 & 303)。預計在這種特殊情況下的結果是:

season  lic  id qtty vessel grossTon 
    … 
    1998 16350  431 68  435  79.54 
    … 

我不介意這licvessel提醒結果行中,我要的是保持seasonid所得的qttygrossTon總和。在上面的例子中,我手動選擇了lic 16350vessel 435

說實話,我不知道該怎麼做,所以我非常感謝任何幫助。

感謝

原始數據(* =行進行組合)

season lic id qtty vessel grossTon 
1998 15593 411 40 2643 31.5 
1999 27271 411 40 2643 31.5 
2000 35758 411 40 2643 31.5 
2001 45047 411 50 2643 31.5 
2002 56291 411 55 2643 31.5 
2003 66991 411 55 2643 31.5 
2004 80581 411 55 2643 31.5 
2005 95058 411 52 NA NA 
2006 113379 411 50 10911 4.65 
2007 120894 411 50 10911 4.65 
2008 130033 411 50 2483 8.5 
2009 139201 411 46 2296 50 
2010 148833 411 46 2296 50 
2011 158395 411 46 2296 50 
1998 16350 431 40 435 57 # * 
1998 16353 431 28 303 22.54 # * 
2000 37491 436 50 2021 19.11 
2001 47019 436 50 2021 19.11 
2002 57588 436 51 2021 19.11 
2003 69128 436 51 2021 19.11 
2004 82400 436 52 2021 19.11 
2005 95599 436 50 2021 19.11 
2006 113126 436 50 2021 19.11 
2007 122387 436 50 2021 19.11 
2008 131126 436 50 2021 19.11 
2009 140417 436 50 2021 19.11 
2010 150673 436 50 2021 19.11 
2011 159776 436 50 2021 19.11 

此外,我需要保留那些只有一個id每個賽季之前和之後的行。像這樣的:(被合併後產生的* =行)

season lic id qtty vessel grossTon 
1998 15593 411 40 2643 31.5 
1999 27271 411 40 2643 31.5 
2000 35758 411 40 2643 31.5 
2001 45047 411 50 2643 31.5 
2002 56291 411 55 2643 31.5 
2003 66991 411 55 2643 31.5 
2004 80581 411 55 2643 31.5 
2005 95058 411 52 NA NA 
2006 113379 411 50 10911 4.65 
2007 120894 411 50 10911 4.65 
2008 130033 411 50 2483 8.5 
2009 139201 411 46 2296 50 
2010 148833 411 46 2296 50 
2011 158395 411 46 2296 50 
1998 16350 431 68 435 79.54 #* 
2000 37491 436 50 2021 19.11 
2001 47019 436 50 2021 19.11 
2002 57588 436 51 2021 19.11 
2003 69128 436 51 2021 19.11 
2004 82400 436 52 2021 19.11 
2005 95599 436 50 2021 19.11 
2006 113126 436 50 2021 19.11 
2007 122387 436 50 2021 19.11 
2008 131126 436 50 2021 19.11 
2009 140417 436 50 2021 19.11 
2010 150673 436 50 2021 19.11 
2011 159776 436 50 2021 19.11 
+0

目前還不清楚你想如何處理'vessel'? – 2013-05-14 04:52:19

+0

這聽起來像'?merge'和'?aggregate'可能有幫助。 – Frank 2013-05-14 04:54:23

+1

@frank,我不確定在這個例子中會合並什麼?我認爲在標題中使用了「合併」,但函數似乎不是必需的,除非我正在閱讀錯誤的問題 – 2013-05-14 04:59:55

回答

10

如果你把你的data.frame成data.table你可以做出偉大使用by說法

library(data.table) 

DT <- data.table(DF) # DF is your original data 

那麼簡單的一行:

我們可以過濾只是1998Season,如果我們想:'

DT[, lapply(.SD, sum), by=list(season, lic, id, vessel)][season==1998] 
    season lic id vessel qtty grossTon 
1: 1998 15593 411 2643 40 31.50 
2: 1998 16350 431 435 68 114.00 
3: 1998 16353 431 303 68 45.08 

整個結果輸出看起來像這樣:

season lic id vessel qtty grossTon 
1: 1998 15593 411 2643 40 31.50 
2: 1999 27271 411 2643 40 31.50 
3: 2000 35758 411 2643 40 31.50 
4: 2001 45047 411 2643 50 31.50 
5: 2002 56291 411 2643 55 31.50 
6: 2003 66991 411 2643 55 31.50 
7: 2004 80581 411 2643 55 31.50 
8: 2005 95058 411  NA 52  NA 
9: 2006 113379 411 10911 50  4.65 
10: 2007 120894 411 10911 50  4.65 
11: 2008 130033 411 2483 50  8.50 
12: 2009 139201 411 2296 46 50.00 
13: 2010 148833 411 2296 46 50.00 
14: 2011 158395 411 2296 46 50.00 
15: 1998 16350 431 435 68 114.00 
16: 1998 16353 431 303 68 45.08 
17: 1999 28641 431 303 68 45.08 
18: 1999 28644 431 435 68 114.00 
19: 2000 37491 436 2021 50 19.11 
20: 2001 47019 436 2021 50 19.11 
21: 2002 57588 436 2021 51 19.11 
22: 2003 69128 436 2021 51 19.11 
23: 2004 82400 436 2021 52 19.11 
24: 2005 95599 436 2021 50 19.11 
25: 2006 113126 436 2021 50 19.11 
26: 2007 122387 436 2021 50 19.11 
27: 2008 131126 436 2021 50 19.11 
28: 2009 140417 436 2021 50 19.11 
29: 2010 150673 436 2021 50 19.11 
30: 2011 159776 436 2021 50 19.11 
    season lic id vessel qtty grossTon 
+1

喜拉斐爾,正確的位置把你的編輯放在OP中,而不是在這裏回答 – 2013-05-14 08:48:12

+0

Hi Ricardo,OP =原文?如果是這樣,我已經做到了。非常感謝! – Rafael 2013-05-14 08:59:45

+0

是的,你明白了。儘管如此,你仍然不清楚你所尋找的是不同的。也許你可以更加明確和具體 – 2013-05-14 09:02:52

3

這裏的一個單行鹼溶液,以下弗蘭克的建議,使用aggregate

Df_agg <- aggregate(. ~ season + lic + id + vessel, data = DF, sum) 
# DF is your data 
# we use season + lic + id + vessel as the grouping elements 

檢查輸出:

Df_agg[with(Df_agg, order(lic)), ] 
# check the output (sort for convenience), identical to Ricardo Saporta's output 
    season lic id vessel qtty grossTon 
21 1998 15593 411 2643 40 31.50 
3 1998 16350 431 435 68 114.00 
1 1998 16353 431 303 68 45.08 
22 1999 27271 411 2643 40 31.50 
2 1999 28641 431 303 68 45.08 
4 1999 28644 431 435 68 114.00 
23 2000 35758 411 2643 40 31.50 
5 2000 37491 436 2021 50 19.11 
24 2001 45047 411 2643 50 31.50 
6 2001 47019 436 2021 50 19.11 
25 2002 56291 411 2643 55 31.50 
7 2002 57588 436 2021 51 19.11 
26 2003 66991 411 2643 55 31.50 
8 2003 69128 436 2021 51 19.11 
27 2004 80581 411 2643 55 31.50 
9 2004 82400 436 2021 52 19.11 
10 2005 95599 436 2021 50 19.11 
11 2006 113126 436 2021 50 19.11 
28 2006 113379 411 10911 50  4.65 
29 2007 120894 411 10911 50  4.65 
12 2007 122387 436 2021 50 19.11 
20 2008 130033 411 2483 50  8.50 
13 2008 131126 436 2021 50 19.11 
17 2009 139201 411 2296 46 50.00 
14 2009 140417 436 2021 50 19.11 
18 2010 148833 411 2296 46 50.00 
15 2010 150673 436 2021 50 19.11 
19 2011 158395 411 2296 46 50.00 
16 2011 159776 436 2021 50 19.11 

檢查1998年,與RS一樣,似乎是OP在期望的輸出中有誤差,57 + 57!= 79.54但是= 114

Df_agg[Df_agg$season == 1998,] 

    season lic id vessel qtty grossTon 
21 1998 15593 411 2643 40 31.50 
3 1998 16350 431 435 68 114.00 
1 1998 16353 431 303 68 45.08 
+1

如果'grossTon'的聚合分別由'vessel(or lic)+ season'來計算,那麼'grossTon'就像OP一樣。等待@Rafael澄清。 – 2013-05-14 08:16:52

+0

'grossTon'的聚合也應該由'season'和'id'來計算。 – Rafael 2013-05-14 09:05:11