Итак, это решение dplyr
/ tidyverse
:
library(tidyverse)
df <- tribble(
~Heart_disease, ~Lung_disease, ~Bowel_disease, ~Nerve_disease, ~Liver_disease
, 0, 1, 0, 1, 0
, NA, 0, 0, 0, 0
, 1, 1, 1, 1, 0
, 0, 1, 0, 0, 1
, 1, 0, 0, 1, 0
, 0, 0, 1, NA, NA
, 1, 0, 0, 0, 0
, 0, 0, 1, 0, 1
, 0, 0, 0, 0, 0
, 0, 1, 1, 1, 1
)
df %>%
mutate(patientID = 1:nrow(.)) %>%
gather("disease", "occured", -patientID) %>%
group_by(patientID) %>%
summarise(nrDiseases = sum(occured, na.rm = TRUE)) %>%
arrange(nrDiseases) %>%
group_by(nrDiseases) %>%
summarise(howManyPeople = n())
nrDiseases howManyPeople
<dbl> <int>
1 0 2
2 1 2
3 2 4
4 4 2
Если неясно, как это работает: %>%
следует читать как «затем». Попробуйте запустить только части кода, чтобы увидеть промежуточные результаты, например, эта часть
df %>%
mutate(patientID = 1:nrow(.)) %>%
gather("disease", "occured", -patientID) %>%
group_by(patientID) %>%
summarise(nrDiseases = sum(occured, na.rm = TRUE))
даст вам
patientID nrDiseases
<int> <dbl>
1 1 2
2 2 0
3 3 4
4 4 2
5 5 2
6 6 1
7 7 1
8 8 2
9 9 0
10 10 4