过滤事件之间的个别日期范围

Filter individual date ranges between events

我目前正在研究一个数据集,其中包含被跟踪一年的参与者,并在大约每月一次的不同日期进行身体测试。这些日期可能因人而异。在他们之间,他们每天两次填写心理问题,我想在物理测试之间分析数据。因此,我想为每个人过滤第一个和最后一个测试日之间的所有行,并保留其间的所有心理数据。

我目前的方法是基于这个答案:

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,您可以尝试:

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))))