我有一个数据集,它描述了一个人的样本以及他们拥有的疾病的数量和类型。在这里,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
我想知道:( a)有多少人患有两种疾病?( b)有多少人患有三种或更多疾病?
我怎么用R来计算呢?
非常感谢你的帮助
发布于 2020-02-06 11:12:22
这里有一条路。我认为每个行号(行名)代表一个人。您希望获得与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"))
发布于 2020-02-06 11:06:30
因此,这是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
https://stackoverflow.com/questions/60093409
复制相似问题