我有一个数据集,每个参与者都有多个观察结果(列名=id(。在每个观察中,每个参与者都有一个诊断(列名=诊断(。
我想计算一下具有特定诊断组合的参与者人数。
请在下面找到 R 代码的可重现示例。我尝试按 id 对数据进行分组,按两个诊断的组合进行过滤,然后计算参与者的数量,但这不会返回任何数据。
你看到任何解决方案吗?
谢谢!
library(tidyverse)
id <- c(1,1,1,2,2,2,3,3,3)
diagnosis <- c("a101", "b101", "a101",
"c101", "c101", "c101",
"b101", "a101", "b101")
data <- data.frame(id, diagnosis, stringsAsFactors = FALSE)
n_a101_and_b101 <- data %>%
group_by(id) %>%
filter((substr(diagnosis,1,4)=="a101") &
(substr(diagnosis,1,4)=="b101")) %>%
tally()
n_a101_and_b101
library(tidyverse)
id <- c(1,1,1,2,2,2,3,3,3)
diagnosis <- c("a101", "b101", "a101",
"a101", "c101", "c101",
"b101", "a101", "b101")
data <- data.frame(id, diagnosis, stringsAsFactors = FALSE)
data %>%
group_by(id) %>%
filter(sum(diagnosis == "a101") * sum(diagnosis == "b101") > 0) %>%
distinct(id) %>%
nrow()
# [1] 2
您也可以使用filter("a101" %in% diagnosis & "b101" %in% diagnosis)
作为替代方法。
我怀疑有一个更好的整洁风格的管道答案,但我会通过集合操作来做到这一点:
获取一组diagnosis_1和 获取diagnosis_2集,然后 找到交叉路口, 即两个集合中都存在的行。
a <- filter(data, diagnosis == "a101")
b <- filter(data, diagnosis == "b101")
intersect(a$id, b$id)
[1] 1 3
length(intersect(a$id, b$id))
[1] 2
可能有几种方法可以实现此目的。我刚刚修改了你的代码:
ab101 <- data %>%
group_by(id) %>%
mutate(yes = (max(diagnosis == "a101") +
max(diagnosis == "b101"))==2) %>%
summarise(yes = yes[1])
sum(ab101$yes)
[1] 2