计算数据集中每个人每个季度的人时(即花费的天数)

Posted

技术标签:

【中文标题】计算数据集中每个人每个季度的人时(即花费的天数)【英文标题】:Calculate Person-Time (ie Days Spent) in Each Quarter for Each Person in a Dataset 【发布时间】:2021-12-29 13:26:05 【问题描述】:

我需要计算数据集中每个人在一个财政季度内花费的天数。这是一个包含 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

更新:越来越接近 - 我想我正在做一些事情,虽然有奇怪的错误

我编写了以下函数,它可以计算出患者在 Q1 内度过了多少天:

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

问题是它在 mutate 中不起作用!我确定我做错了什么;如果有人可以帮助完成最后一步,我会得到它!


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. 

【问题讨论】:

这能回答你的问题吗? Is there a way to calculate total power consumption per 30 minute interval given total consumtion, Start and End time? 【参考方案1】:

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

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

【讨论】:

感谢您的发帖!这会返回他们在哪个季度结束的每个 ID 的总 fu_time。我需要的是他们在每个季度内花费的总时间。我知道,奇怪的区别。基本上每个季度都在尝试计算人年。 您需要在示例中添加“时间”度量吗?也就是说,我们知道开始日期和结束日期,但我们需要另一个变量来保存有关任务时间(例如,剥土豆的小时数)的信息。 我想计算某人在每个财政季度内花费的总天数。所以 ID #1 总共会花费 1765 天,这将在不同的季度之间进行划分。因为诊断是 2004 年 7 月 24 日,ID1 将在第 3 季度花费约 66 天(即 7 月的最后 6 天加上 8 月和 9 月的约 60 天),然后在当年的第 4 季度花费 90 天。那么 ID1 在 2005 年、2006 年、2007 年、2008 年和 2009 年每个季度将花费大约 90 天。然后在 2009 年,第 1 季度(即 1 月至 3 月)将花费约 90 天,然后在第 2 季度将花费约 54 天(即 30 4 月,5 月 24 日)【参考方案2】:

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

这里是最终的函数和运行时的样子。希望这对其他人有所帮助!

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

最终结果是一个数据框,其中包含每位患者在每个季度内度过的天数。

【讨论】:

以上是关于计算数据集中每个人每个季度的人时(即花费的天数)的主要内容,如果未能解决你的问题,请参考以下文章

计算员工在开始和结束日期之间应报告工作的天数

MySQL计算两个日期相差的天数月数年数

每个用户达到的标记数量阈值

sql 如何计算财务季度结束前的剩余天数

sql 如何使用SQL计算日历季度的剩余天数

excel中求日期减掉上一个季度末月的20日,也就是两者之间的天数。