通过组变量计算多个数值变量的百分比
Calculating percentages for multiple numeric variables by a group variable
我正在尝试计算取决于唯一类别的列的百分比,如图像所示。
正如我们在图像中看到的,其中 Tag
是一列,Long
是另一列。所以这里我们要基于 Unique Tag No
计算 Long
列的百分比。在所有 Tag=1
和 Long
列中的值的示例之一 1004 is 0.42%
和 544 is 0.22%
和 545 is 0.22%
和 282 is 0.11%
和 1 is 0.00%
的 Total
2376。类似地,对于每个 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))
这里的 Expected Output 是用 Color 写的 Image 输出。谢谢
这是处理您的任务的一种方法。您按 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
我正在尝试计算取决于唯一类别的列的百分比,如图像所示。
正如我们在图像中看到的,其中 Tag
是一列,Long
是另一列。所以这里我们要基于 Unique Tag No
计算 Long
列的百分比。在所有 Tag=1
和 Long
列中的值的示例之一 1004 is 0.42%
和 544 is 0.22%
和 545 is 0.22%
和 282 is 0.11%
和 1 is 0.00%
的 Total
2376。类似地,对于每个 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))
这里的 Expected Output 是用 Color 写的 Image 输出。谢谢
这是处理您的任务的一种方法。您按 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