r-为数据集中的每个人计算每个季度的人员时间(即花费的天数)



我需要计算数据集中每个人在一个财政季度内花费的天数。这是一个有4个假设人物的数据帧:

id <- c('1', '2', '3', '4') 
end_date <- c("2009-05-24", "2002-02-04", "2015-09-23", "2011-12-04") 
start_date  <- c("2004-07-24", "1992-07-04", "2011-03-23", "2001-07-04") 
df <- data.frame(id, start = ymd(start_date), end = ymd(end_date)) 

我可以很容易地计算出他们每人和整体的随访总数:


> df %>% mutate(fu_time = end - start) 
id      start        end   fu_time
1  1 2004-07-24 2009-05-24 1765 days
2  2 1992-07-04 2002-02-04 3502 days
3  3 2011-03-23 2015-09-23 1645 days
4  4 2001-07-04 2011-12-04 3805 days
> df %>% mutate(fu_time = end - start) %>% summarize(total = sum(fu_time))
total
1 10717 days

更新:越来越近了-我想我发现了一些事情,通过出现了奇怪的错误

我编写了以下函数,可以计算出一名患者在第一季度内的天数:

q1fun <- function(x,y) { 
sum(month(seq(x, y, by = "days")) %in% 1:3)
}

基本上,它扩展序列,计算月数,然后返回该值。例如:


> q1fun(ymd("2004-07-24"), ymd("2009-05-24"))
[1] 451

问题是它在变异中不起作用!我确信我做错了什么;如果有人能帮我完成最后一步,我会成功的!


df %>% 
+   mutate(q1 = q1fun(start, end))
Error: Problem with `mutate()` input `q1`.
x 'from' must be of length 1
i Input `q1` is `q1fun(start, end)`.
Run `rlang::last_error()` to see where the error occurred. 

只需按日历年的季度对数据进行分组:

df2<-df %>% mutate(fu_time = end - start, quarter=lubridate::quarter(end_date)) %>%
group_by(quarter) %>% summarise(fu_time=sum(fu_time))
barplot(df2$quarter,as.numeric(df2$fu_time))

好的,所以我想好了,需要按行分组,因为我没有矢量化函数。

下面是最后的函数以及运行时的样子。希望这能帮助其他人!

> # Calculate quarter 1/2/3/4 times
> q1fun <- function(x,y) { 
+   sum(month(seq(x, y, by = "days")) %in% 1:3)
+ }
> q2fun <- function(x,y) { 
+   sum(month(seq(x, y, by = "days")) %in% 4:6)
+ }
> q3fun <- function(x,y) { 
+   sum(month(seq(x, y, by = "days")) %in% 7:9)
+ }
> q4fun <- function(x,y) { 
+   sum(month(seq(x, y, by = "days")) %in% 10:12)
+ }
> 
> df %>% 
+   rowwise %>% 
+   mutate(q1 = q1fun(start, end), 
+          q2 = q2fun(start, end), 
+          q3 = q3fun(start, end), 
+          q4 = q4fun(start,end))
# A tibble: 4 x 7
# Rowwise: 
id    start      end           q1    q2    q3    q4
<chr> <date>     <date>     <int> <int> <int> <int>
1 1     2004-07-24 2009-05-24   451   418   437   460
2 2     1992-07-04 2002-02-04   847   819   917   920
3 3     2011-03-23 2015-09-23   370   455   453   368
4 4     2001-07-04 2011-12-04   902   910  1009   985

最终结果是一个数据帧,显示每个患者在每个季度内的天数。

最新更新