R 根据每个案例的开始和结束日期,计算每周存在多少案例
我是新来的,所以如果错过任何会议,我向你道歉 我有一个~2000行数据集,其中包含三年内发生的独特病例的数据。每个案例都有开始日期和结束日期。我希望能够得到一个新的数据框架,显示在这三年期间每周发生多少病例 我拥有的数据集的结构如下所示: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
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周的案例,您应该获得与上述相同的结果。