2015-04-20 53 views
0

mydf看起來像這樣;如果不符合條件,則使用聚合返回零

id<-c(1,1,2,2,3,3,4,4) 
type<-c("a","a","a","b","a","a","a","b") 
total<-c(1.1,1.2,2.1,2.3,3.4,3.6,4.2,4.3) 
mydf<-data.frame(id,type,total) 

我想使用聚合總和type = b的總數,但產生一個具有所有id號的df。所以寧可使用

mydf.ag<-aggregate(total~id, sum, data=mydf) 

我想使用類似

mydf.ag<-aggregate(total~id, sum, data=mydf[mydf$type=="b",]) 

但這僅返回類型= B的實例的DF。理想我想mydf.ag包括對ID的1和3個零,從而mydf.ag應該像

mydf.ag<-data.frame(id=c(1,2,3,4), total=c(0,2.3,0,4.3)) 

使用聚合將是理想的,但任何其他建議,歡迎!

+0

'聚合+合併「可能是需要的。 'merge(data.frame(id = unique(mydf $ id)),aggregate(total_id,sum,data = mydf [mydf $ type =='b',]),all = TRUE)'並且改變NA到0後 – akrun

回答

2

它可以與data.table

library(data.table) 
setDT(mydf)[, list(total=sum(total[type=='b'])), id] 

或者dplyr

library(dplyr) 
mydf%>% 
    group_by(id) %>% 
    summarise(total=sum(total[type=='b'])) 
0

做或者你可以先設置Total等於零,其中type == "b"和運行聚合函數

mydf[mydf$type != "b", "total"] <- 0 
aggregate(total~id, sum, data=mydf)