R: извлечение количества идентификаторов, которые удовлетворяют нескольким условиям - PullRequest
0 голосов
/ 07 мая 2020

Я хочу идентифицировать те идентификаторы в наборе данных, по которым недавно развилось заболевание. Набор данных представляет собой дневник, в котором люди ежедневно отвечают на вопрос «да / нет» о том, есть ли у них заболевание.

ID <- c(1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3)
Date <- c("2020-03-10","2020-03-11","2020-03-12","2020-03-13","2020-03-14","2020-03-12","2020-03-13","2020-03-14","2020-03-15","2020-03-16","2020-03-17","2020-03-18", "2020-03-12","2020-03-13","2020-03-14","2020-03-15","2020-03-16","2020-03-17","2020-03-18","2020-03-19","2020-03-20")
Disease <- c("No","No","Yes","Yes","Yes","No","No","No", "Yes","Yes","Yes","No","Yes","Yes","No","No","No","Yes","Yes","Yes","Yes")

df <- data.frame(ID, Date, Disease)

df
ID   Date         Disease
1    2020-03-10   No
1    2020-03-11   No
1    2020-03-12   Yes
1    2020-03-13   Yes
1    2020-03-14   Yes
2    2020-03-12   No
2    2020-03-13   No
2    2020-03-14   No
2    2020-03-15   Yes
2    2020-03-16   Yes
2    2020-03-17   Yes
2    2020-03-18   No
3    2020-03-12   Yes
3    2020-03-13   Yes
3    2020-03-14   No
3    2020-03-15   No
3    2020-03-16   No
3    2020-03-17   Yes
3    2020-03-18   Yes
3    2020-03-19   Yes
3    2020-03-20   Yes

Однако, чтобы его можно было охарактеризовать как «недавно развившееся заболевание», человек должен соответствовать следующим условиям: 1. Человек должен иметь «да» не менее двух дней подряд. 2. Человек должен отвечать «нет» в течение как минимум 3 дней подряд перед первым «да».

В качестве результата я хотел бы получить количество людей, выполняющих эти условия. Итак, при извлечении набора данных, приведенного выше, это будет два (ID 2 + 3).

Кто-нибудь знает способ, как этого добиться? Заранее благодарим за уделенное время!

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Это может быть компактный способ обнаружения шаблонов в столбце Disease. Это основано на аналогичном ответе, представленном здесь:

{ ссылка }

Определите нужный шаблон (в данном случае 3 «Нет», а затем 2 «Да» "). Отфильтруйте строки, соответствующие этому шаблону; включить shift из data.table, поскольку здесь используется вектор для Map вместо lead из dplyr, который требует длины 1 для n.

library(tidyverse)
library(data.table)

pattern = c("No", "No", "No", "Yes", "Yes")

df %>%
  group_by(ID) %>%
  filter(Reduce("&", Map("==", shift(Disease, n = 0:(length(pattern) - 1), type = "lead"), pattern))) %>% 
  ungroup() %>%
  summarise(Total = n_distinct(ID))
0 голосов
/ 07 мая 2020

Немного запутанный способ сделать это - использовать функцию dplyr::lag().

 library(tidyverse)
 library(lubridate)
 df %>% 
    mutate(Date = ymd(Date)) %>%
    group_by(ID) %>% 
    mutate(day_1 = lag(Disease, 1, order_by = Date), 
           day_2 = lag(Disease, 2, order_by = Date), 
           day_3 = lag(Disease, 3, order_by = Date), 
           day_4 = lag(Disease, 4, order_by = Date)) %>% 
    filter(day_1 == "No" & day_2 == "No" & day_3 == "No" & day_4 == "Yes" &        Disease == "Yes")
    distinct(ID) %>% 
    summarise("Number of patients matching the condition" = n())

Это группирует строки по идентификатору, поэтому все вычисления производятся индивидуально для каждого человека. Затем он получает значение заболевания в столбце накануне, накануне и так далее в течение последних 4 дней. Затем проверьте, соответствует ли каждая строка в наборе данных условиям. Затем возьмите уникальные идентификаторы и посчитайте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...