如何最好地计算R中不同列的相对份额?



下面是示例数据和代码。我有两个问题。首先,我需要indtotal列是twodigit代码的和,并使其保持不变,如下所示。原因是这样我可以做一个简单的计算,一列除以另一列,得到smbshare数。当我尝试以下命令时,

second <- first %>% 
group_by(twodigit,smb) %>% 
summarize(indtotal = sum(employment))

它按twodigitsmb分解它。
第二个问题是,如果值不存在,让它产生一个0。最好的例子是twodigit代码51和smb = 4。当给定的两位数字没有4个不同的smb值时,我正在寻找它来产生0。

注:smb是small business的缩写

naicstest <- c (512131,512141,521921,522654,512131,536978,541214,531214,621112,541213,551212,574121,569887,541211,523141,551122,512312,521114,522112)
employment <- c(11,130,315,17,190,21,22,231,15,121,19,21,350,110,515,165,12,110,111)
smb <- c(1,2,3,1,3,1,1,3,1,2,1,1,4,2,4,3,1,2,2)
first <- data.frame(naicstest,employment,smb)
first<-first %>% mutate(twodigit = substr(naicstest,1,2))
second <- first %>% group_by(twodigit) %>% summarize(indtotal = sum(employment))

期望结果低于

twodigit      indtotal    smb      smbtotal           smbshare
51            343        1           23  (11+12)     23/343
51            343        2           130             130/343
51            343        3           190             190/343
51            343        4           0               0/343
52            1068       1           17              23/1068
52            1068       2           221 (110+111)   221/1068
52            1068       3           315             315/1068
52            1068       4           515              515/1068

这样就提供了所需的所有列,但顺序略有不同。你可以使用selectrelocate来获得你想要的顺序,我想:

first %>%
group_by(twodigit, smb) %>%
summarize(smbtotal = sum(employment)) %>%
ungroup() %>%
complete(twodigit, smb, fill = list('smbtotal' = 0)) %>%
group_by(twodigit) %>%
mutate(
indtotal = sum(smbtotal), 
smbshare = smbtotal / indtotal
) 
`summarise()` has grouped output by 'twodigit'. You can override using the `.groups` argument.
# A tibble: 32 × 5
# Groups:   twodigit [8]
twodigit   smb smbtotal indtotal smbshare
<chr>    <dbl>    <dbl>    <dbl>    <dbl>
1 51           1       23      343   0.0671
2 51           2      130      343   0.379 
3 51           3      190      343   0.554 
4 51           4        0      343   0     
5 52           1       17     1068   0.0159
6 52           2      221     1068   0.207 
7 52           3      315     1068   0.295 
8 52           4      515     1068   0.482 
9 53           1       21      252   0.0833
10 53           2        0      252   0     
# … with 22 more rows

最新更新