У меня есть набор данных, который описывает выборку людей и количество и тип заболеваний, которые у них есть. Здесь 1 означает, что у человека есть заболевание, а 0 означает, что у человека нет заболевания. NA обозначает пропущенные значения. Это выглядит примерно так:

Библиотека ( 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
)

   Heart_disease Lung_disease Bowel_disease Nerve_disease Liver_disease
           <dbl>        <dbl>         <dbl>         <dbl>         <dbl>
 1             0            1             0             1             0
 2            NA            0             0             0             0
 3             1            1             1             1             0
 4             0            1             0             0             1
 5             1            0             0             1             0
 6             0            0             1            NA            NA
 7             1            0             0             0             0
 8             0            0             1             0             1
 9             0            0             0             0             0
10             0            1             1             1             1

Я хотел бы знать: а) Сколько людей имеют две болезни? б) Сколько людей имеют три или более заболеваний?

Как я могу рассчитать это с помощью R?

Большое спасибо за вашу помощь

0
Lola92 6 Фев 2020 в 13:58

2 ответа

Лучший ответ

Вот один из способов. Я думаю, что каждый номер строки (имя строки) представляет человека. Вы хотите получить сумму строки с rowSums(). Если у вас есть это, вы можете агрегировать данные. Я посчитал, сколько строк имеют 2 в столбце, total. Я сделал подобное для другого условия.

library(dplyr)

mutate(mydf, total = rowSums(mydf, na.rm = T)) %>% 
summarize(two = sum(total == 2), morethan3 = sum(total >= 3))

#  two morethan3
#1   4         2

< Сильный > DATA

mydf <- structure(list(Heart_disease = c(0L, NA, 1L, 0L, 1L, 0L, 1L, 
0L, 0L, 0L), Lung_disease = c(1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 
0L, 1L), Bowel_disease = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 
1L), Nerve_disease = c(1L, 0L, 1L, 0L, 1L, NA, 0L, 0L, 0L, 1L
), Liver_disease = c(0L, 0L, 0L, 1L, 0L, NA, 0L, 1L, 0L, 1L)), class = 
"data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
1
jazzurro 6 Фев 2020 в 13:26

Итак, это решение 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
0
Georgery 6 Фев 2020 в 11:11