Фильтровать отдельные диапазоны дат между событиями

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

Мой текущий подход основан на этом ответе: Как отфильтровать строки в фрейме данных, которые не находятся в пределах определенного периода времени значения события в другой строке?

library(dplyr)

# Simplified dataset

set.seed(1)
day_count <- c(1:8,12:20,14:26)
date <- as.Date(c(1:8,12:20,14:26), origin = Sys.Date())
id <- c(rep("A",9),rep("B",9),rep("C",12))
mood <- c(sample(1:100, 9),sample(1:100, 9),sample(1:100, 12))
ISRT <- c(c(NA,100,NA,NA,NA,NA,NA,90,NA),
        c(NA,NA,70,NA,NA,NA,80,NA,NA),
        c(90,NA,NA,100,NA,NA,50,NA,NA,NA,10,NA))

dat <- data_frame(day_count,date, id, mood, ISRT)

dat <-  dat %>% mutate(test_day = !is.na(ISRT))

dat_between_tests <- dat %>%
  mutate(date = as.Date(date, format="%Y-%m-%d")) %>%   
  group_by(id) %>%
      filter(Reduce(`|`, purrr::map(date[test_day == TRUE],
                                ~dplyr::between(date, .x -1  , .x + 1))))

Я включил один день до и после тестового дня, потому что в противном случае этот подход не работает (что в идеале мне бы хотелось). В этом упрощенном примере этот подход работает. Но когда я запускаю это в своем собственном наборе данных, я получаю следующую ошибку:

Error:
! Problem with `filter()` input `..1`.
ℹ Input `..1` is `Reduce(...)`.
✖ Input `..1` must be of size 172 or 1, not size 0.
ℹ The error occurred in group 4: id = "1cf91d6c2f7ddfbd68b93dbc04a4c667".

Кто-нибудь знает, что вызывает это и как я могу решить эту ошибку? Может ли это быть как-то связано с наличием нескольких тестовых дней в течение всего периода исследования?

Трудно отладить ошибку, не видя, какие данные находятся в этой группе, но, возможно, попробуйте отфильтровать, где id = "1cf91d6c2f7ddfbd68b93dbc04a4c667" и посмотреть, есть ли что-нибудь необычное в форматировании этих id данных?

Stuart Demmer 17.05.2022 09:48

Спасибо за ваш ответ! Сначала я подумал, что проблема в том, что id отформатирован как символ. Ошибка все еще существует, когда я перекодировал переменную в факторы. Глядя на данные, я думаю, что проблема может быть вызвана отсутствием тестового дня для этого конкретного человека. Это означало бы, что мне не нужно включать этого участника в желаемый набор данных. Есть ли способ определить это в моем фильтре?

Jur 17.05.2022 11:14

См. мой предложенный ответ ниже. Также кажется, что у этого человека может быть много (172?) показаний настроения. Может быть, стоит подтвердить, действительно ли у них не было тестовых дней, прежде чем просто их исключить?

Stuart Demmer 17.05.2022 11:27
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
3
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы исключить этот конкретный id из вашего набора данных, вы можете попробовать:

dat_between_tests <- dat %>%
  mutate(date = as.Date(date, format="%Y-%m-%d")) %>%   
  filter(id != "1cf91d6c2f7ddfbd68b93dbc04a4c667") %>% # this should exclude the id with no test days
  group_by(id) %>%
  filter(Reduce(`|`, 
                purrr::map(date[test_day == TRUE], 
                           ~dplyr::between(date, .x -1, .x + 1))))

Спасибо за ответ. Оказалось, что у трех участников не было тестовых данных. Я отфильтровал их на основе вашего решения, и это, похоже, сработало: ``` test_days <- dat[that(dat$test_day==T),] ids_test_players <- unique(test_days$id) dat_between_tests <- dat %>% mutate (date = as.Date(date, format="%Y-%m-%d")) %>% filter(id %in% ids_test_players) %>% group_by(id) %>% filter(Reduce(|, purrr::map(date[test_day == TRUE], ~dplyr::between(date, .x -1 , .x + 1)))) ```

Jur 17.05.2022 13:32

Другие вопросы по теме