2013-05-14 45 views
5

Dưới đây là một phần nhỏ của khung dữ liệu gốc của tôi. Tôi cần phải kết hợp các hàng trong đó một id cụ thể được lặp lại trong một mùa cụ thể và licvessel khác nhau của nó. Bằng cách kết hợp tôi cần tổng hợp qttygrossTon.Kết hợp các hàng và tổng giá trị của chúng

Hãy chụp id 431 trong ví dụ season 1998 làm ví dụ (*).

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

Đối tượng cùng 431 có hai khác nhau lic (16350 & 16353) và hai khác nhau vessels (435 & 303). Kết quả dự kiến ​​trong trường hợp cụ thể này là:

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

Tôi không quan tâm mà licvessel nhắc nhở trong dòng kết quả, những gì tôi muốn là để giữ season, id và tổng kết quả của qttygrossTon. Trong ví dụ trên, tôi đã chọn thủ công lic 16350vessel 435.

Thành thật mà nói tôi không biết phải làm gì, vì vậy tôi rất cảm kích sự giúp đỡ nào.

Cảm ơn

dữ liệu gốc (* = hàng để được kết hợp)

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 

Ngoài ra tôi cần phải giữ những hàng trước và sau đó chỉ có một id mỗi mùa. Như thế này: (* = hàng kết quả sau khi được kết hợp)

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

Không rõ cách bạn muốn xử lý 'tàu'? –

+0

Có vẻ như '? Merge' và'? Aggregate' có thể trợ giúp ở đây. – Frank

+1

@frank, tôi không chắc chắn một trong những gì sẽ hợp nhất trong ví dụ này? Tôi nghĩ rằng "hợp nhất" đã được sử dụng trong tiêu đề, nhưng chức năng không xuất hiện được yêu cầu, trừ khi tôi đọc câu hỏi sai –

Trả lời

10

Nếu bạn bật data.frame của bạn thành một data.table bạn có thể tận dụng vĩ đại của đối số by

library(data.table) 

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

sau đó nó là chỉ đơn giản là một dòng:

chúng tôi có thể lọc chỉ là 1998Season, nếu chúng ta muốn: '

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 

Toàn bộ sản lượng kết quả sẽ như thế này:

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

hi rafael, vị trí chính xác nơi chỉnh sửa của bạn là trong OP, không phải ở đây trong câu trả lời –

+0

Hi Ricardo, OP = bài đăng gốc? nếu có, tôi đã làm. Cảm ơn rất nhiều! – Rafael

+0

vâng, bạn hiểu rồi. Tuy nhiên, nó vẫn không rõ ràng những gì bạn đang tìm kiếm đó là khác nhau. Có lẽ bạn có thể rõ ràng hơn và cụ thể hơn –

3

Dưới đây là một giải pháp cơ bản một dòng, sau gợi ý của Frank sử dụng 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 

Kiểm tra kết quả:

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 

Kiểm tra năm 1998, giống như RS, có vẻ như tại OP có lỗi trong kết quả mong muốn, 57 + 57! = 79.54 nhưng = 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' sẽ là OP nếu tổng hợp cho' grossTon' sẽ được tính riêng biệt và theo 'mùa (hoặc lic) + mùa'. Chờ đợi cho @Rafael để làm rõ mặc dù. –

+0

tập hợp cho 'grossTon' cũng phải được tính bằng' mùa' và 'id'. – Rafael

Các vấn đề liên quan