Я предполагаю, что вы хотите, это только для мертвых пробандов (как живые из них не имеют даты окончания), вот возможный data.table
решение, которое в значительной степени самостоятельно поясняющие
library(data.table)
setDT(df)[census == "died",
as.data.table(table(year(seq.Date(startDate, endDate, by = "day")))),
by = id]
# id V1 N
# 1: ZF001 2012 77
# 2: ZF001 2013 365
# 3: ZF001 2014 365
# 4: ZF001 2015 136
# 5: ZF004 2013 51
# 6: ZF004 2014 354
# 7: ZF005 2013 37
# 8: ZF005 2014 365
# 9: ZF005 2015 167
в основном мы вычислим все дни от начала до даты окончания в id
, то, что мы используем функцию year
для того, чтобы извлечь года, а затем просто вычисление частоты
Или эквивалентное dplyr
решение
library(dplyr)
df %>%
group_by(id) %>%
filter(census=='died') %>%
do(as.data.frame(table(year(seq.Date(.$startDate, .$endDate, by ='day')))))
Редактировать в комментариях: Если вы хотите, чтобы это для всех пациентов (умерших или живых), в то время как для живых те, которые вы хотите использовать Sys.Date
мы могли бы определить простую вспомогательную функцию в этом случае
dateFunc <- function(x, y){
if(is.na(y)) {
as.data.table(table(year(seq.Date(x, Sys.Date(), by = "day"))))
} else as.data.table(table(year(seq.Date(x, y, by = "day"))))
}
setDT(df)[, setNames(dateFunc(startDate, endDate), c("Year", "Days")), by = id]
# id Year Days
# 1: ZF001 2012 77
# 2: ZF001 2013 365
# 3: ZF001 2014 365
# 4: ZF001 2015 136
# 5: ZF002 2013 73
# 6: ZF002 2014 365
# 7: ZF002 2015 222
# 8: ZF003 2013 58
# 9: ZF003 2014 365
# 10: ZF003 2015 222
# 11: ZF004 2013 51
# 12: ZF004 2014 354
# 13: ZF005 2013 37
# 14: ZF005 2014 365
# 15: ZF005 2015 167
# 16: ZF006 2014 37
# 17: ZF006 2015 222
# 18: ZF007 2014 30
# 19: ZF007 2015 19
# 20: ZF008 2014 21
# 21: ZF008 2015 222
# 22: ZF009 2015 44
данных
df <- structure(list(id = structure(1:9, .Label = c("ZF001", "ZF002",
"ZF003", "ZF004", "ZF005", "ZF006", "ZF007", "ZF008", "ZF009"
), class = "factor"), census = structure(c(2L, 1L, 1L, 2L, 2L,
1L, 3L, 1L, 3L), .Label = c("alive", "died", "survived"), class = "factor"),
startDate = structure(c(15629, 15998, 16013, 16020, 16034,
16399, 16406, 16415, 16463), class = "Date"), endDate = structure(c(16571,
NA, NA, 16424, 16602, NA, 16454, NA, 16506), class = "Date")), .Names = c("id",
"census", "startDate", "endDate"), row.names = c(NA, -9L), class = "data.frame")
Дэвид, ТНХ, мне нужно все пациенты до текущего SYSDATE ... –
И ... если я пытаюсь data.table вариант, я получаю только три строки: идентификатор V1 N 1: ZF001 2012 1 2: ZF004 2013 1 3: ZF005 2013 1 –
это же при использовании dplyr ... :-(Кажется, я чего-то не хватает ... –