Подсчитать количество дел в двух из нескольких категорий в R? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть набор данных, который описывает выборку людей, а также количество и тип заболеваний, которые у них есть. Здесь 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?

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

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вот один из способов. Я думаю, что каждый номер строки (название строки) представляет человека. Вы хотите получить сумму строки с 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

ДАННЫЕ

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"))
0 голосов
/ 06 февраля 2020

Итак, это решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...