2017-10-13 286 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)))]'作品 –