r语言 - 如何计算具有多个观察值/行的参与者数量,这些观察/行在列的不同行中具有值的组合?



我有一个数据集,每个参与者都有多个观察结果(列名=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

最新更新