2017-02-15 67 views
0

這裏的值的TOP X%是表查詢捕獲基於子集的聚集

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  

每個包裹有分組,並且每個分組具有,b和c的建築物。其目標是捕獲包含每個包裹內的總建築物(例如80%)的包的包。例如,地塊3中所有建築物的總數爲50 + 20 + 10 + 80 + 50 = 210; 210的80%是168.所以,我們需要數據包1(140)+數據包2(70)達到80%。

我正在嘗試爲每個數據包手動完成總和,然後手動計算比例。我知道在R中有更好的方法來實現這個功能。我已經使用了dplyr,sqldf和其他R函數,但是這對我來說有點陡峭。幫助讚賞。

+0

我似乎不明白你是什麼意思,「我們需要packet1和packet2去實現它。」但是,我已經開始了一個答案,並且可以使用更新進行編輯。 – theArun

+0

謝謝。這個想法是識別和分離每個包裹內的數據包,總共給我們80%。你當然提出了一些非常有用的建議。在這個例子中,我想說明在地塊3中,數據包1和數據包2需要達到總值的80%以上。最終目標是找出包含包裹和相應數據包的行總數達到80%或更多的行。希望澄清。 – HexGuy

回答

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 
+0

謝謝阿倫。我能夠使用R,data.table根據您的方法計算總數據包總數和組數總和。我現在可以繼續識別數據包。 – HexGuy