2017-10-13 188 views
1

我有一個數據表,其中數據在4個不同的級別(級別0,1,2和3)給出。我想要計算每個狀態的等級3中的供應如何在等級2中分配。 (我在表保持occ_code使得即使state_codelevel是一樣的,它是一個唯一的記錄)如何計算具體百分比

創建樣本表:

library(data.table) 
state_code = c(rep(1,14)) 
level = c(0,1,2,3,3,2,3,1,2,3,3,3,2,3) 
occ_code = LETTERS[1:14] 
supply = c(100,60,50,25,25,10,10,40,30,10,10,10,10,10)  
DT = data.table(state_code,occ_code,level,supply) 

希望的輸出

perc = c(NA,NA,NA,0.5,0.5,NA,1,NA,NA,0.33,0.33,0.33,NA,1) 
DT2 = data.table(DT,perc) 

基本上,我想要使用這些百分比來投影僅在級別2給出的另一個數據。

+1

的計算是不用於計算是 - 在級n供給清楚 – akrun

+0

確定,上下文供應在級n + 1的總和。例如總供給量爲100(等級0),其被劃分爲(等級1的60和40),等級1的供應 - 被進一步分成等級2,然後等級2的供應被進一步劃分爲等級3. –

+1

這樣會有道理,但你的榜樣不符合那個描述。對於狀態代碼1,等級總數爲100,然後是60,然後是50,然後是50. – Frank

回答

3

可能的解決方案:

DT[, rl := rleid(level), by = state_code 
    ][level == 3, perc := supply/sum(supply), by = .(state_code, rl) 
    ][, rl := NULL][] 

其給出:

> DT 
    state_code occ_code level supply  perc 
1:   1  A  0 100  NA 
2:   1  B  1  60  NA 
3:   1  C  2  50  NA 
4:   1  D  3  25 0.5000000 
5:   1  E  3  25 0.5000000 
6:   1  F  2  10  NA 
7:   1  G  3  10 1.0000000 
8:   2  H  1  40  NA 
9:   2  I  2  30  NA 
10:   2  J  3  10 0.3333333 
11:   2  K  3  10 0.3333333 
12:   2  L  3  10 0.3333333 
13:   2  M  2  10  NA 
14:   2  N  3  10 1.0000000 
1

將數據重構爲sto再僅級別3信息的其它信息可從該計算:

library(data.table) 
dt3 <- DT[level == 3, ] 
dt3[, parent := c("2C", "2C", "2F", "2I", "2I", "2I", "2M")] 
dt3[, perc := round(supply/sum(supply), 4), by = parent] 

    state_code occ_code level supply parent perc 
1:   1  D  3  25  2C 0.5000 
2:   1  E  3  25  2C 0.5000 
3:   1  G  3  10  2F 1.0000 
4:   2  J  3  10  2I 0.3333 
5:   2  K  3  10  2I 0.3333 
6:   2  L  3  10  2I 0.3333 
7:   2  N  3  10  2M 1.0000 

分別計算爲supplylevel 0,1,和2:

dt3[, sum(supply)] 
dt3[, sum(supply), by = state_code] 
dt3[, sum(supply), by = parent] 

第二種方法:

DT[level == 2, parent := paste0(level, occ_code)] 
DT[level > 1, parent := parent[1], by = .(cumsum(!is.na(parent)))] 
DT[level == 3, perc := round(supply/sum(supply), 4), by = parent] 

    state_code occ_code level supply parent perc 
1:   1  A  0 100  NA  NA 
2:   1  B  1  60  NA  NA 
3:   1  C  2  50  2C  NA 
4:   1  D  3  25  2C 0.5000 
5:   1  E  3  25  2C 0.5000 
6:   1  F  2  10  2F  NA 
7:   1  G  3  10  2F 1.0000 
8:   2  H  1  40  NA  NA 
9:   2  I  2  30  2I  NA 
10:   2  J  3  10  2I 0.3333 
11:   2  K  3  10  2I 0.3333 
12:   2  L  3  10  2I 0.3333 
13:   2  M  2  10  2M  NA 
14:   2  N  3  10  2M 1.0000 
+0

什麼是反對票?目標是提供一個複雜的答案,其中涉及按照「級別」和數據順序(行號)進行分組?在提供的數據集中存儲了冗餘信息,這是一種簡化事情並且不會刪除任何數據的替代方法。 – manotheshark

+0

不是我的downvote,但你最初的答案依賴於硬編碼的水平,它不能很好地伸縮 – Jaap

+0

@manotheshark,謝謝你的答案!你可能會解釋這個代碼:DT [level> 1,parent:= parent [1],by =。(cumsum(!is.na(parent)))]'作品 –