Я пытаюсь создать фрейм данных, который показывает все промежуточные месяцы для моего набора данных по темам. Вот пример того, как выглядят данные:
dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',
'2017-02-01', '2017-04-01'))
colnames(dat) <- c('id', 'value', 'date')
dat$Out.Of.Study <- c("", "", "Out", "Out", "", "", "Out", "", "", "Out")
dat
id value date Out.Of.Study
1 1 30 2017-01-01
2 1 30 2017-02-01
3 1 25 2017-04-01 Out
4 2 25 2017-02-01 Out
5 3 25 2017-01-01
6 3 25 2017-02-01
7 3 25 2017-03-01 Out
8 4 20 2017-01-01
9 4 20 2017-02-01
10 4 20 2017-04-01 Out
Если я хочу показать промежутки между месяцами, когда данные не были собраны (но субъект все еще был включен в исследование), я могу использовать функцию complete()
. Однако проблема в том, что я получаю все пропущенные месяцы для каждого идентификатора субъекта на основе минимального и максимального месяца, указанного в наборе данных:
## Add Dates by Group
library(tidyr)
complete(dat, id, date)
id date value Out.Of.Study
1 1 2017-01-01 30
2 1 2017-02-01 30
3 1 2017-03-01 NA <NA>
4 1 2017-04-01 25 Out
5 2 2017-01-01 NA <NA>
6 2 2017-02-01 25 Out
7 2 2017-03-01 NA <NA>
8 2 2017-04-01 NA <NA>
9 3 2017-01-01 25
10 3 2017-02-01 25
11 3 2017-03-01 25 Out
12 3 2017-04-01 NA <NA>
13 4 2017-01-01 20
14 4 2017-02-01 20
15 4 2017-03-01 NA <NA>
16 4 2017-04-01 20 Out
Проблема в том, что я не хочу, чтобы пропущенные месяцы превышали последний наблюдаемый месяц субъекта (по сути, у меня есть предметы, которые подвергаются цензуре и должны быть исключены из исследования) или появляются до месяца субъект начал изучение. Например, субъект 2 был только участником месяца «2017-02-01». Я хотел бы, чтобы данные представляли, что это был единственный месяц, в котором они находились, и чтобы они не были представлены дополнительными месяцами после и дополнительным месяцем ранее, как показано выше. То же самое относится и к субъекту 3, у которого есть дополнительный месяц, даже если они не участвуют в исследовании.
Возможно, complete()
не лучший способ сделать это?