【问题标题】:How to count the number of participants with multiple observations/rows that have a combination of values in different rows of a column?如何计算具有多个观察/行的参与者的数量,这些观察/行在列的不同行中具有值组合?
【发布时间】:2019-12-05 11:00:58
【问题描述】:

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

【问题讨论】:

  • &amp; 必须是 |(substr(diagnosis, 1,4)=="a101") | (substr(diagnosis,1,4)=="b101")。诊断不能同时是a101b101
  • 您无需使用substr,因为您正在尝试发现完全匹配。

标签: r filter group-by dplyr


【解决方案1】:
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 &amp; "b101" %in% diagnosis) 作为替代。

【讨论】:

    【解决方案2】:

    我怀疑有一个更好的 tidyverse 风格的管道答案,但我会通过集合操作来做到这一点:

    获取诊断集_1 和 获取diagnostics_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
    

    【讨论】:

      【解决方案3】:

      可能有几种方法可以实现这一点。我刚刚修改了你的代码:

      ab101 <- data %>% 
        group_by(id) %>% 
        mutate(yes = (max(diagnosis == "a101") + 
                        max(diagnosis == "b101"))==2) %>% 
        summarise(yes = yes[1])
      sum(ab101$yes)
      

      [1] 2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 2022-01-22
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多