2013-05-14 37 views
5

Aşağıda, orijinal veri çerçevemin bir kısmı var. Belirli bir sezonda belirli bir id tekrarlanır ve lic ve vessel farklı olan bu satırları birleştirmek gerekiyor. Birleştirerek toplam qtty ve grossTon'a ihtiyacım var.Satırları birleştirin ve değerlerini belirtin

Lütfen season 1998 örneğine id 431 numaralı telefonu (*) ekleyin.

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

Aynı konu 431 iki farklı lic (16350 & 16353) ve iki farklı vessels (435 & 303) sahiptir. Bu özel durumda beklenen sonuç:

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

Ne istediğinizi season, id ve qtty ve grossTon elde edilen toplamı tutmaktır, lic ve vessel çıkan satırda hatırlatmak hangi umursamıyorum. Yukarıdaki örnekte manuel olarak lic 16350 ve vessel 435'u seçtim.

Dürüst olmak gerekirse, ne yapacağımı bilmiyorum, bu yüzden herhangi bir yardımı çok takdir ediyorum.

Teşekkür

Orijinal verileri

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 

Ayrıca ben sadece bir id sezon başına sahip olan önceki ve sonraki satırları tutmak gerek (* = satırlar kombine edilecek). Şunun gibi: (kombine edildikten sonra ortaya çıkan * = satır) Bir data.table içine data.frame açarsanız

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

Gemi ile nasıl başa çıkmak istediğiniz açık değil mi? –

+0

"Birleştirme" ve "Birleştirme" gibi şeyler burada yardımcı olabilir. – Frank

+1

@frank, Bu örnekte neyin birleştirileceğinden emin değilim? Sanırım "birleştirme" başlığında kullanılmıştı, ancak yanlış –

cevap

10

Ne olduğunu

library(data.table) 

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

sonra by argüman büyük yararlanabilir basitçe bir satır: Biz isterseniz

Biz, sadece 1998Season filtreleyebilirsiniz: '

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 

tüm sonuç çıktı şuna benzer:

: çıkışını kontrol

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

: Burada

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

selam rafael, doğru yer Düzenleme işleminizi OP'de yapın, cevapta değil –

+0

Merhaba Ricardo, OP = orijinal gönderi? eğer öyleyse, zaten yaptım. Çok teşekkürler! – Rafael

+0

evet, anladın. Yine de, aradığınız şey farklı değil. Belki daha açık ve somut olabilirsiniz. –

3

aggregate kullanmak Frank'in öneri sonrasında tek satırlık taban çözüm
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 yılını, RS ile aynı şekilde kontrol edin, OP'de istenen çıktıda bir hata vardır, 57 + 57! = 79.54 fakat = 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',“ grossTon ”için toplama ayrı olarak ve“ gemi (ya da lic) + sezonu ”olarak hesaplanacaksa, OP'nin sahip olduğu gibi olacaktır. Gerçi temizlemek için @Rafael için bekliyorum. –

+0

"grossTon" için toplama, "season" ve "id" tarafından da hesaplanmalıdır. – Rafael

İlgili konular