2013-08-12 2 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), за исключением catch и potlift. Мне нужно сохранить значения (client... held) и сумму catch и potlift; Поэтому мой новый кадр данных должен быть, как на примере ниже:

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