查询以基于子集聚合捕获TOP X%的值

时间:2017-02-15 15:41:45

标签: sql r subset aggregation

这是表格

parcel| packet|a |b | c
1     | p1    |20|40|50     
1     | p2    |20|90|50     
1     | p3    |50|40|50     
2     | p1    |80|40|50     
2     | p2    |20|90|50     
3     | p1    |10|80|50     
3     | p2    |20|0|50     

每个包裹都有包裹,每个包裹都有a,b和c建筑物。目标是捕获包含每个包裹内总建筑物的设定推荐(例如80%)的包。例如,地块3中所有建筑物的总数为50 + 20 + 10 + 80 + 50 = 210; 210的80%是168.因此,我们需要数据包1(140)+数据包2(70)达到80%。

我目前正在尝试手动为每个数据包完成总和,然后手动计算比例。我知道在R中有更好的方法来实现这一点。我使用了dplyr,sqldf和其他R函数,但这对我来说有点陡峭。帮助赞赏。

1 个答案:

答案 0 :(得分:0)

如果我理解您要查找的内容,请使用data.table包:

library(data.table)

dt <- data.table(parcel = c(1,1,1,2,2,3,3),
                 packet = c("p1","p2","p3","p1","p2","p1","p2"), 
                 a = c(20,20,50,80,20,10,20),
                 b = c(40,90,40,40,90,80,0),
                 c = c(50,50,50,50,50,50,50))

dt[,total:= a+b+c,][,group:= sum(total)*.80,by = parcel]
dt
#    parcel packet  a  b  c total  group
# 1:      1     p1 20 40 50   110 328
# 2:      1     p2 20 90 50   160 328
# 3:      1     p3 50 40 50   140 328
# 4:      2     p1 80 40 50   170 264