如果不满足条件,则使用aggregate返回零

时间:2015-04-20 18:20:02

标签: r aggregate

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",])

但是这只返回一个带有type = b实例的df。理想情况下,我希望mydf.ag为id&#39; s 1和3包含零。所以mydf.ag应该看起来像

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

使用聚合是理想的,但欢迎任何其他建议!

2 个答案:

答案 0 :(得分: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']))

答案 1 :(得分:0)

或者你可以先为Total设置type == "b"等于零并运行你的聚合函数

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