Home > Blockchain >  How to calculate percentages of two distinct variables?
How to calculate percentages of two distinct variables?

Time:11-03

For constructing a barchart with two variables (where one is a subset of the other), I need to calculate percentages.

I have two variables - severity of disease and death. I need to show what proportion of each severity group died.

I am able to calculate the proportion of those who died or proportion of the severity categories, but I am not able to do both in one code line. I am trying to do this to pipe that then into ggplot barchart.

The code I was trying to use, but it does not work as the pct_severity does not give the proportions of the severity categories as those are already divided by the death subcategory:

severity %>% 
  count(severity, death) %>% 
  group_by(severity) %>% 
  mutate(pct_died = n / sum(n)) %>% 
  group_by(severity, n) %>% 
  mutate(pct_severity = sum(n)/severity)

The data:

death;severity
0;4
0;2
0;2
0;2
0;3
0;2
0;3
0;3
0;2
0;1
0;4
0;2
0;3
0;4
0;2
0;4
0;1
0;3
0;3
0;2
0;2
0;2
0;3
0;2
0;2
0;3
0;2
0;4
0;3
0;2
0;2
0;3
0;2
0;2
0;5
0;3
0;2
0;2
0;3
0;2
0;2
0;1
0;4
0;3
0;3
0;3
0;2
0;2
0;3
0;2
0;2
0;5
0;2
0;2
0;3
0;3
0;3
0;2
0;2
0;2
0;3
0;3
0;3
0;2
0;2
0;2
0;2
0;2
0;3
0;2
0;2
0;2
0;3
0;3
0;4
0;2
0;3
0;2
0;2
0;3
0;2
0;3
0;2
0;2
0;2
0;3
0;4
0;1
0;3
0;3
0;2
0;3
0;2
0;3
0;2
0;1
0;2
0;2
0;2
0;4
0;2
0;2
0;3
0;2
0;2
0;2
0;3
0;2
0;3
0;2
0;3
0;3
0;3
0;2
0;3
0;2
0;2
0;2
0;2
0;2
0;2
0;3
0;2
0;3
0;2
0;2
0;2
0;2
0;2
0;2
0;1
0;2
0;2
0;1
0;3
0;2
0;5
0;3
0;4
0;2
0;2
0;3
0;2
0;2
0;2
0;3
0;2
0;2
0;3
0;2
0;3
0;3
0;2
0;2
0;2
0;2
0;2
0;3
0;3
0;2
0;3
0;3
0;2
0;2
0;3
0;1
0;2
0;2
0;1
0;3
0;2
0;3
0;2
0;1
0;5
0;2
0;3
0;2
0;2
0;2
0;2
0;2
0;3
0;2
0;2
0;2
0;2
0;2
0;3
0;2
0;3
0;2
0;2
0;3
0;2
0;2
0;2
0;2
0;5
0;1
0;3
0;2
0;3
0;2
0;3
0;3
0;2
0;3
0;2
0;3
0;2
0;2
0;4
0;1
0;2
0;2
0;3
0;2
0;3
0;2
0;2
0;2
0;3
0;2
0;3
0;3
0;2
0;2
0;2
0;1
0;2
0;1
0;3
0;2
1;5
0;3
0;3
0;5
1;4
1;3
1;4
1;3
0;3
0;1
1;5
1;3
1;5
1;4
0;3
0;2
1;3
1;5
1;4
0;3
0;3
1;3
1;3
0;2
1;1
1;5
0;3
0;3
1;3
1;4
1;3
0;2
1;5
1;5
1;2
1;5
0;5
0;5
1;4
1;5
0;5

CodePudding user response:

I am not certain what pct_severity actually is. I assume it the number of cases with given severity as proportion of total observations. I'll assume that each row in your dataset is an observation about one individual and the death attribute is a numeric representation of a boolean.

data |>
  group_by(severity) %>%
  summarise(
    cases = n(), 
    deaths = sum(death),
    pct_deaths = deaths/cases * 100)  %>%
ungroup() |>
mutate(pct_severity = cases/sum(cases) * 100)

Produces:

  severity cases deaths pct_deaths pct_severity
     <dbl> <int>  <dbl>      <dbl>        <dbl>
1        1    16      1      6.25          5.82
2        2   135      1      0.741         49.1 
3        3    89      8      8.99          32.4 
4        4    17      6      35.3          6.18
5        5    18      9      50            6.55

It will work without the ungroup(), but I've added it for clarity and to avoid errors later.

Here is a slightly more terse alternative.

data |>
  group_by(severity) %>%
  summarise(
    cases = n(), 
    deaths = sum(death),
    pct_deaths = deaths/cases * 100,
    pct_severity = cases/nrow(data) * 100)
  • Related