你可以使用相同的合并和汇总在一点点更可读的方式。将实际的df合并到左外部连接all.x = TRUE
上将会完成这项工作。我希望这更好理解。
df <- data.frame(id=c(01,02,03,04),category=c("AB","BC","AB","CD"),
quantity=c(235,987,366,287))
df <- merge(df,aggregate(quantity ~ category, data=df, sum),"category",all.x = TRUE)
names(df)[4] <- "sum.category"
df
# category id quantity.x sum.category
# AB 1 235 601
# AB 3 366 601
# BC 2 987 987
# CD 4 287 287
如果你还想要一个更易于理解的方式,那么sql是最好的选择。为此,您可能需要sqldf
库。我们正在做同样的聚合,并以sql方式合并回实际的df。它更像是一个自我加入的事物。和SQL代码相当容易理解
library (sqldf)
dfnew<-sqldf("select a.*,b.sum_quantity
from df a left join
(select category, sum(quantity) sum_category
from df group by 1) b
on a.category=b.category")
dfnew
# category id quantity sum_category
# AB 1 235 601
# BC 2 987 987
# AB 3 366 601
# CD 4 287 287
@帕斯卡尔:做完了,抱歉给您带来不便 – Malta