过滤事件之间的个别日期范围
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))))
我目前正在研究一个数据集,其中包含被跟踪一年的参与者,并在大约每月一次的不同日期进行身体测试。这些日期可能因人而异。在他们之间,他们每天两次填写心理问题,我想在物理测试之间分析数据。因此,我想为每个人过滤第一个和最后一个测试日之间的所有行,并保留其间的所有心理数据。
我目前的方法是基于这个答案:
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))))