通过组变量计算多个数值变量的百分比

Nab*_*ikh 3 r percentage reshape2 dplyr

我正在尝试计算列的百分比,其中取决于图像中所示的唯一类别. 在此输入图像描述

正如我们在图像中看到的那样Tag是One Column并且Long是另一列.所以我们希望Long列的百分比计算基于Unique Tag No.在所有的实施例中的一个Tag=1,并在值Long1004 is 0.42%544 is 0.22%545 is 0.22%282 is 0.11%1 is 0.00%Total2376类似地,对于每一个Tag和百分比计算对于其它列如Medium,Short,Urgent是必须要做的.

df <- data.frame(Tag = c(1 ,1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,2),
       YPred = c("L1", "L2" ,"L3", "L4", "L5", "L1", "L2", "L3", "L4", "L5"),
       Long = c(1004 , 544 , 545 , 282  ,  1 ,2068 ,3006 ,3711 ,2342 ,  33),
       Medium = c(108, 252, 211, 149,   0,  17, 110, 248, 341,   4),
       short = c(58, 118, 131,  73,   4,   0,  43, 150, 189,2),
       Urgent = c(5, 70, 65, 24 , 5 ,22 ,18, 31 ,96,  2))
Run Code Online (Sandbox Code Playgroud)

这里的预期输出是用Color写的图像输出.谢谢

jaz*_*rro 6

这是处理任务的一种方法.您按数据分组数据Tag.然后,你想你的四列(即描述的计算Long,Medium,short,和Urgent).您将每组中的每个值除以每个组的值的总和mutate_at().

library(dplyr)

group_by(df, Tag) %>%
mutate_at(.vars = vars(Long:Urgent),
          .funs = funs(. / sum(., na.rm = TRUE)))

#     Tag  YPred         Long      Medium       short     Urgent
#   <dbl> <fctr>        <dbl>       <dbl>       <dbl>      <dbl>
# 1     1     L1 0.4225589226 0.150000000 0.151041667 0.02958580
# 2     1     L2 0.2289562290 0.350000000 0.307291667 0.41420118
# 3     1     L3 0.2293771044 0.293055556 0.341145833 0.38461538
# 4     1     L4 0.1186868687 0.206944444 0.190104167 0.14201183
# 5     1     L5 0.0004208754 0.000000000 0.010416667 0.02958580
# 6     2     L1 0.1853046595 0.023611111 0.000000000 0.13017751
# 7     2     L2 0.2693548387 0.152777778 0.111979167 0.10650888
# 8     2     L3 0.3325268817 0.344444444 0.390625000 0.18343195
# 9     2     L4 0.2098566308 0.473611111 0.492187500 0.56804734
#10     2     L5 0.0029569892 0.005555556 0.005208333 0.01183432
Run Code Online (Sandbox Code Playgroud)