首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R的几个类别中,计算两个案例的数量?

在R的几个类别中,计算两个案例的数量?
EN

Stack Overflow用户
提问于 2020-02-06 10:58:21
回答 2查看 49关注 0票数 0

我有一个数据集,它描述了一个人的样本以及他们拥有的疾病的数量和类型。在这里,1表示该人患有该疾病,0表示该人没有该疾病。NA表示缺少的值。看起来是这样的:

图书馆(Tidyverse)

代码语言:javascript
运行
复制
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

我想知道:( a)有多少人患有两种疾病?( b)有多少人患有三种或更多疾病?

我怎么用R来计算呢?

非常感谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-06 11:12:22

这里有一条路。我认为每个行号(行名)代表一个人。您希望获得与rowSums()的行和。如果你拥有它,你就可以聚合数据。我计算了列中有多少行有2行,total。对于另一种情况,我也是这样做的。

代码语言:javascript
运行
复制
library(dplyr)

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

#  two morethan3
#1   4         2

数据

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-02-06 11:06:30

因此,这是dplyr / tidyverse解决方案:

代码语言:javascript
运行
复制
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

如果还不清楚,这是如何工作的:%>%将被解读为“那么”。试着只运行代码的一部分,以查看中间结果,例如这个部分

代码语言:javascript
运行
复制
df %>%
    mutate(patientID = 1:nrow(.)) %>%
    gather("disease", "occured", -patientID) %>%
    group_by(patientID) %>%
    summarise(nrDiseases = sum(occured, na.rm = TRUE))

会给你这个

代码语言:javascript
运行
复制
   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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60093409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档