Вычисление среднего с критериями, используя даты в R - PullRequest
0 голосов
/ 17 июня 2019

У меня есть фрейм данных, включающий людей с первичным ключом (уникальным идентификатором) и датой диагностики определенного состояния. Я создал новую переменную для каждого человека с датой постановки диагноза +/- 180 дней.

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

Я связал эти фреймы данных с помощью первичного ключа. Каждое наблюдение теперь находится в отдельной строке, связанной с первичным ключом.

Моя цель - получить другую переменную среднего среднего результата теста для каждого человека, исходя из результатов любых тестов, выполненных в течение 180 дней до или после даты постановки диагноза. Редко, некоторые люди не имеют никаких тестов, выполненных в течение этого времени. Я хочу посчитать этих людей и количественно оценить эти тестовые значения как отсутствующие, нет данных.

Все даты в формате ГГГГ-ММ-ДД.

Я прошу прощения, что не могу предоставить дополнительную информацию. Я действительно новичок в R, но у меня нет другого способа завершить этот анализ. Заранее спасибо!

cohort %>% 
group_by(key) %>% 
filter((testdate <= diagnosisdate + 180) | testdate >= diagnosisdate - 180) %>% 
summarise(mean = mean(testresult))

Возвращает фрейм данных с одним наблюдением и одной переменной, значение NA

1 Ответ

0 голосов
/ 18 июня 2019

Это сложно сделать правильно без примеров данных.Я думаю, что есть пара вопросов.Во-первых, вы должны убедиться, что даты имеют правильный формат даты.Для этого я рекомендую использовать ymd() из пакета lubridate.Кроме того, вы не можете просто добавить 180 дней.Используйте + days(180).Во-вторых, я думаю, что вы должны использовать оператор & внутри оператора фильтра вместо |.Кроме того, рассмотрите возможность использования аргумента na.rm = TRUE, чтобы игнорировать пропуски.Попробуйте это:

library(lubridate)
cohort %>% 
  group_by(key) %>% 
  mutate(
    testdate = ymd(testdate),
    diagnosisdate = ymd(diagnosisdate)
  ) %>%
  filter((testdate <= diagnosisdate + day(180)) & testdate >= diagnosisdate - days(180)) %>% 
  summarise(mean = mean(testresult, na.rm = TRUE))

Обратите внимание, что вы полностью отфильтровываете лиц, у которых нет результата теста в рассматриваемом временном окне.Ваш код не даст вам ничего для этих предметов.Вы можете справиться с этим на втором этапе.

...