计算R中的动物相关时间,即二元重叠日期范围
我的数据是动物群体中随时间变化的个体(个体出生,个体死亡),因此所有个体在不同的时间长度上与其他个体重叠。A列为个人身份,B列为“开始日期”,C列为“结束日期” 我想创建一个表格或矩阵(后者可能更容易阅读),它显示了所有成对的个体同时在群体中存活/在一起的时间。我想在R做这个 示例数据:计算R中的动物相关时间,即二元重叠日期范围,r,date,overlap,R,Date,Overlap,我的数据是动物群体中随时间变化的个体(个体出生,个体死亡),因此所有个体在不同的时间长度上与其他个体重叠。A列为个人身份,B列为“开始日期”,C列为“结束日期” 我想创建一个表格或矩阵(后者可能更容易阅读),它显示了所有成对的个体同时在群体中存活/在一起的时间。我想在R做这个 示例数据: ID start.date end.date 1 5/22/83 10/31/15 2 7/10/94 3/15/15 3 5/24/96 10/31/15 4 10
ID start.date end.date
1 5/22/83 10/31/15
2 7/10/94 3/15/15
3 5/24/96 10/31/15
4 10/1/99 5/12/14
输出示例(数字表示重叠的大致年份):
尽管我心中有一个特定的问题(动物协同时间),但该解决方案/方法可用于计算任何类型的重叠日期范围的二元持续时间
已经指出了一些表面上类似的工作,使用foverlaps函数,但是这个函数和我在其他问题中看到的所有类似问题的相关文档似乎都涉及到涉及两个数据表的问题。诚然,基本概念是相似的,在不同的数据中找到共同的日期,但我不知道如何编写代码来使用foverlaps函数解决我的问题(在一个表中找到所有可能的个体集合中的共同范围)。我曾考虑过进行某种重复循环,但这会很麻烦,而且随着数据表的增大会变得更加困难。foverlaps()
不是必需的。相反,使用非等自联接(类似于combn()
所做的)将每个ID相互比较,并使用pmin()
和pmax()
计算重叠年数
请注意,OP的预期结果存在差异。主对角线包含每个人的年龄。我相信这是一个有价值的信息时,比较协同时间
资料
请注意,主对角线不再表示年龄,而是表示个人与团体的关系的总持续时间。能否提供一些可复制的数据和预期输出?请参见此处以获取建议:
数据。表
有一个名为foverlaps
的函数,该函数可能有用。可能的重复项请参见此答案:
1 2 3 4
1 NA 21 19 15
2 NA NA 19 15
3 NA NA NA 15
4 NA NA NA NA
library(data.table)
# add dummy ID column to join on for non-equi join
DT[, join.ID := ID][
# non-equi join to create combinations
DT, on = .(join.ID >= join.ID)][
# compute years of overlap
, overlap.years := round(as.integer(
pmin(end.date, i.end.date) - pmax(start.date, i.start.date)) / 365.25)][
# remove negative values (no overlap)
overlap.years > 0][
# reshape from long to wide format
, dcast(.SD, i.ID ~ ID)]
i.ID 1 2 3 4
1: 1 32 21 19 15
2: 2 NA 21 19 15
3: 3 NA NA 19 15
4: 4 NA NA NA 15
library(data.table)
DT <- fread(
"ID start.date end.date
1 5/22/83 10/31/15
2 7/10/94 3/15/15
3 5/24/96 10/31/15
4 10/1/99 5/12/14"
)
# convert date string to class Date
cols <- c("start.date", "end.date")
DT[, (cols) := lapply(.SD, lubridate::mdy), .SDcols = cols]
# read dat of new case
DT2 <- fread(
"ID start.date end.date
1 5/22/83 10/31/15
2 7/10/94 3/15/15
3 5/24/96 10/31/15
4 10/1/99 5/12/14
4 3/20/15 5/12/16"
)
cols <- c("start.date", "end.date")
DT2[, (cols) := lapply(.SD, lubridate::mdy), .SDcols = cols]
DT2
DT2[, join.ID := ID][
DT2, on = .(join.ID >= join.ID), allow = TRUE][
, overlap.years := as.integer(
pmin(end.date, i.end.date) - pmax(start.date, i.start.date)) / 365.25][
overlap.years > 0][
, dcast(.SD, i.ID ~ ID, function(x) round(sum(x), 1), fill = NA)]
i.ID 1 2 3 4
1: 1 32.4 20.7 19.4 15.2
2: 2 NA 20.7 18.8 14.6
3: 3 NA NA 19.4 15.2
4: 4 NA NA NA 15.8