2013-08-12 53 views
1

我有一個大的數據框,其中某些行在其某些列中有重複的值。我想保留重複的值並對不同的值進行求和。下面是我的數據樣本:將某些行和列的單元格求和

data<-data.frame(season=c(2008,2009,2010,2011,2011,2012,2000,2001), 
      lic=c(132228,140610,149215,158559,158559,944907,37667,45724), 
      client=c(174,174,174,174,174,174,175,175), 
      qtty=c(31,31,31,31,31,31,36,26), 
      held=c(60,65,58,68,68,70,29,23), 
      catch=c(7904,6761,9236,9323.2,801,NA,2330,3594.5), 
      potlift=c(2715,2218,3000,3887,750,NA,2314,3472)) 

season lic client qtty held catch potlift 
2008 132228 174 31 60 7904 2715 
2009 140610 174 31 65 6761 2218 
2010 149215 174 31 58 9236 3000 
2011 158559 174 31 68 9323.2 3887 
2011 158559 174 31 68 801 750 
2012 944907 174 31 70 NA NA 
2000 37667 175 36 29 2330 2314 
2001 45724 175 26 23 3594.5 3472 

注意,季節2011被重複,每個變量(client... held),除catchpotlift。我需要保留(client... held)和總和catchpotlift的值;因此,我的新的數據幀應該像下面的例子:

season lic client qtty held catch potlift 
2008 132228 174 31 60 7904 2715 
2009 140610 174 31 65 6761 2218 
2010 149215 174 31 58 9236 3000 
2011 158559 174 31 68 10124.2 4637 
2012 944907 174 31 70 NA NA 
2000 37667 175 36 29 2330 2314 
2001 45724 175 26 23 3594.5 3472 

我試圖這樣做使用aggregate,不過這個功能和一切。任何幫助將不勝感激。

回答

2
data$catch <- with(data, ave(catch,list(lic,client,qtty,held),FUN=sum)) 
data$potlift <- with(data, ave(potlift,list(lic,client,qtty,held),FUN=sum)) 
unique(data) 
    season lic client qtty held catch potlift 
1 2008 132228 174 31 60 7904.0 2715 
2 2009 140610 174 31 65 6761.0 2218 
3 2010 149215 174 31 58 9236.0 3000 
4 2011 158559 174 31 68 10124.2 4637 
6 2012 944907 174 31 70  NA  NA 
7 2000 37667 175 36 29 2330.0 2314 
8 2001 45724 175 26 23 3594.5 3472 
+0

您好托馬斯,非常感謝! – Rafael

+0

通常,我發現將它們粘貼在'內''或'transform',當我使用'ave'來做多個「聚合」時,我發現'aggregate'在這個數據集上工作得很好! – A5C1D2H2I1M1N2O1R2T1

2

aggregate似乎爲我工作得很好,但我不知道你試圖什麼:

> aggregate(cbind(catch, potlift) ~ ., data, sum, na.action = "na.pass") 
    season lic client qtty held catch potlift 
1 2001 45724 175 26 23 3594.5 3472 
2 2000 37667 175 36 29 2330.0 2314 
3 2010 149215 174 31 58 9236.0 3000 
4 2008 132228 174 31 60 7904.0 2715 
5 2009 140610 174 31 65 6761.0 2218 
6 2011 158559 174 31 68 10124.2 4637 
7 2012 944907 174 31 70  NA  NA 

在這裏,使用cbind識別您希望通過聚合列。然後,您可以指定所有其他列,或者只需使用.來指示「使用cbind調用中未提及的所有其他列。」

+0

太好了,非常感謝! – Rafael

相關問題