R 根据每个案例的开始和结束日期,计算每周存在多少案例

R 根据每个案例的开始和结束日期,计算每周存在多少案例,r,R,我是新来的,所以如果错过任何会议,我向你道歉 我有一个~2000行数据集,其中包含三年内发生的独特病例的数据。每个案例都有开始日期和结束日期。我希望能够得到一个新的数据框架,显示在这三年期间每周发生多少病例 我拥有的数据集的结构如下所示: ID Start_Date End_Date 1 2015-01-04 2017-11-02 2 2015-01-05 2015-10-26 3 2015-01-07 2015-03-04 4 2

我是新来的,所以如果错过任何会议,我向你道歉

我有一个~2000行数据集,其中包含三年内发生的独特病例的数据。每个案例都有开始日期和结束日期。我希望能够得到一个新的数据框架,显示在这三年期间每周发生多少病例

我拥有的数据集的结构如下所示:

ID  Start_Date  End_Date      
1   2015-01-04  2017-11-02    
2   2015-01-05  2015-10-26    
3   2015-01-07  2015-03-04     
4   2015-01-12  2016-05-17  
5   2015-01-15  2015-04-08
6   2015-01-21  2016-07-31 
7   2015-01-21  2015-07-16
8   2015-01-22  2015-03-03  
`欢迎来到SO

在解决问题之前,请确保已安装一些软件包并运行

install.packages(c("tidyr","dplyr","lubridate"))
如果您尚未安装这些软件包

接下来我将向您展示一个现代的R解决方案,这些软件包非常神奇

这是一种解决方法:

library(readr)
library(dplyr)
library(lubridate)

raw_data <- 'id start_date  end_date
1   2015-01-04  2017-11-02
2   2015-01-05  2015-10-26
3   2015-01-07  2015-03-04
4   2015-01-12  2016-05-17
5   2015-01-15  2015-04-08
6   2015-01-21  2016-07-31
7   2015-01-21  2015-07-16
8   2015-01-22  2015-03-03'

curated_data <- read_delim(raw_data, delim = "\t") %>% 
  mutate(start_date = as.Date(start_date)) %>% # convert column 2 to date format assuming the date is yyyy-mm-dd
  mutate(weeks_lapse = as.integer((start_date - min(start_date))/dweeks(1))) # count how many weeks passed since the lowest date in the data

curated_data %>% 
  group_by(weeks_lapse) %>%  # I group to count by week
  summarise(cases_per_week = n()) # now count by group by week
库(readr)
图书馆(dplyr)
图书馆(lubridate)
原始数据%#假设日期为yyyy-mm-dd,将第2列转换为日期格式
mutate(weeks_-release=as.integer((start_-date-min(start_-date))/dweeks(1))#计算自数据中最低日期起经过的周数
策划的_数据%>%
分组(周间隔)%>%#我分组每周计数
总结(每周病例数=n())#现在每周分组统计
解决办法是:

# A tibble: 3 x 2
  weeks_lapse cases_per_week
        <int>          <int>
1           0              3
2           1              2
3           2              3
#一个tible:3 x 2
每周失效案例
1           0              3
2           1              2
3           2              3

使用
sqldf
包可以更容易地解决这个问题,但我想还是坚持使用
dplyr

方法:

library(dplyr)
library(lubridate)

# First create a data frame having all weeks from chosen start date to end date. 
# 2015-01-01 to 2017-12-31
df_week <- data.frame(weekStart = seq(floor_date(as.Date("2015-01-01"), "week"),
                                     as.Date("2017-12-31"), by = 7))
df_week <- df_week %>% 
  mutate(weekEnd = weekStart + 7,
                   weekNum = as.character(weekStart, "%V-%Y"), 
                   dummy = TRUE)
# The dummy column is only for joining purpose. 
# Header looks like
#> head(df_week)
#   weekStart    weekEnd weekNum dummy
#1 2014-12-28 2015-01-04 52-2014  TRUE
#2 2015-01-04 2015-01-11 01-2015  TRUE
#3 2015-01-11 2015-01-18 02-2015  TRUE
#4 2015-01-18 2015-01-25 03-2015  TRUE
#5 2015-01-25 2015-02-01 04-2015  TRUE
#6 2015-02-01 2015-02-08 05-2015  TRUE

# Prepare the data as mentioned in OP
df <- read.table(text = "ID  Start_Date  End_Date      
1   2015-01-04  2017-11-02    
2   2015-01-05  2015-10-26    
3   2015-01-07  2015-03-04     
4   2015-01-12  2016-05-17  
5   2015-01-15  2015-04-08
6   2015-01-21  2016-07-31 
7   2015-01-21  2015-07-16
8   2015-01-22  2015-03-03", header = TRUE, stringsAsFactors = FALSE)

df$Start_Date <- as.Date(df$Start_Date)
df$End_Date <- as.Date(df$End_Date)
df <- df %>% mutate(dummy = TRUE)     # just for joining

# Use dplyr to join, filter and then group on week to find number of cases
# in each week
df_week %>%
  left_join(df, by = "dummy") %>%
  select(-dummy) %>%
  filter((weekStart >= Start_Date & weekStart <= End_Date) | 
           (weekEnd >= Start_Date & weekEnd <= End_Date)) %>%
  group_by(weekStart, weekEnd, weekNum) %>%
  summarise(cases = n())

# Result
#   weekStart  weekEnd    weekNum cases
#   <date>     <date>     <chr>   <int>
# 1 2014-12-28 2015-01-04 52-2014     1
# 2 2015-01-04 2015-01-11 01-2015     3
# 3 2015-01-11 2015-01-18 02-2015     5
# 4 2015-01-18 2015-01-25 03-2015     8
# 5 2015-01-25 2015-02-01 04-2015     8
# 6 2015-02-01 2015-02-08 05-2015     8
# 7 2015-02-08 2015-02-15 06-2015     8
# 8 2015-02-15 2015-02-22 07-2015     8
# 9 2015-02-22 2015-03-01 08-2015     8
#10 2015-03-01 2015-03-08 09-2015     8
# ... with 139 more rows
库(dplyr)
图书馆(lubridate)
#首先创建一个数据框,包含从所选开始日期到结束日期的所有周。
#2015-01-01至2017-12-31
df_周头(df_周)
#周开始周末周数虚拟
#1 2014-12-28 2015-01-04 52-2014真实
#2 2015-01-04 2015-01-11 01-2015真实
#3 2015-01-11 2015-01-18 02-2015真实
#4 2015-01-18 2015-01-25 03-2015真实
#5 2015-01-25 2015-02-01 04-2015真实
#6 2015-02-01 2015-02-08 05-2015真实
#准备OP中提到的数据
df%
过滤器((weekStart>=开始日期&weekStart=开始日期&周末%)
分组依据(周开始、周末、周数)%>%
总结(案例=n()
#结果
#周开始周末周数案例
#                
# 1 2014-12-28 2015-01-04 52-2014     1
# 2 2015-01-04 2015-01-11 01-2015     3
# 3 2015-01-11 2015-01-18 02-2015     5
# 4 2015-01-18 2015-01-25 03-2015     8
# 5 2015-01-25 2015-02-01 04-2015     8
# 6 2015-02-01 2015-02-08 05-2015     8
# 7 2015-02-08 2015-02-15 06-2015     8
# 8 2015-02-15 2015-02-22 07-2015     8
# 9 2015-02-22 2015-03-01 08-2015     8
#10 2015-03-01 2015-03-08 09-2015     8
#…还有139行

您需要说明每周需要包含多少案例才能计入该周。为了得到更好的答案,我们希望您展示一些“研究成果”在StackOverflow上发布问题时。请参阅:我认为,如果您想让人们更容易给您答案,您可以包括生成测试数据框的代码和生成所有周列表的代码:开始日期和结束日期。需要区分您是否希望一周内的新案例数占总数的百分比在那一周内。所以我想结束是正确的做法,但一定要阅读所有评论并使用功能来改进你的问题(在真诚地努力搜索我怀疑存在的早期答案之后)@42-我同意。OP的期望输出不是很清楚。OP广泛提到了3年内每周的病例数。我不确定结果是否是期望输出。事实上,我无法理解结果。我所做的是从“零”开始任意值。假设2015-01-04是包含在1月第一周的日期,因此该周是任意的第0周。然后假设我有一个日期2015-01-07,属于第1周。尝试按照该逻辑手动计算第0,1,…,n周的案例,您应该获得与上述相同的结果。