【发布时间】:2018-02-19 10:40:13
【问题描述】:
我想找到每个 ID 的重叠日期,并使用重叠日期创建一个新行,并将这些行的字符 (char) 组合起来。我的数据可能有 >2 个重叠并且需要 >2 个字符组合。例如。风险管理
数据:
ID date1 date2 char
15 2003-04-05 2003-05-06 E
15 2003-04-20 2003-06-20 R
16 2001-01-02 2002-03-04 M
17 2003-03-05 2007-02-22 I
17 2005-04-15 2014-05-19 C
17 2007-05-15 2008-02-05 I
17 2008-02-05 2012-02-14 M
17 2010-06-07 2011-02-14 V
17 2010-09-22 2014-05-19 P
17 2012-02-28 2013-03-04 R
我想要的输出:
ID date1 date2 char
15 2003-04-05 2003-04-20 E
15 2003-04-20 2003-05-06 ER
15 2003-05-06 2003-06-20 R
16 2001-01-02 2002-03-04 M
17 2003-03-05 2005-04-15 I
17 2005-04-15 2007-02-22 IC
17 2005-04-15 2007-05-15 C
17 2007-05-15 2008-02-05 CI
17 2008-02-05 2012-02-14 CM
17 2010-06-07 2011-02-14 CV
17 2010-09-22 2014-05-19 CP
17 2012-02-28 2013-03-04 CR
17 2014-05-19 2014-05-19 P
17 2010-06-07 2012-02-14 MV
17 2010-09-22 2011-02-14 VP
17 2012-02-28 2013-03-04 RP
我尝试过的: 我尝试使用以下行从当前行中减去日期 2:
df$diff <- c(NA,df[2:nrow(tdf), "date1"] - df[1:(nrow(df)-1), "date2"])
然后确定行之间的重叠:
df$overlap[which(df$diff<1)] <-1
df$overlap.up <- c(df$overlap[2:(nrow(df))], "NA")
df$overlap.final[which(df$overlap==1 | df$overlap.up==1)] <- 1
然后我选择了那些有重叠.final==1 的并将它们放入另一个数据框中,并找到每个 ID 的重叠。
但是,我意识到这过于简单和有缺陷,因为它只选择顺序发生的重叠(使用第一步中的日期差异)。我需要做的是获取每个 ID 的一系列日期并循环遍历每个组合以确定是否存在重叠,然后,如果有,则记录开始和结束日期并创建一个新字符“char”,表明是什么在这两个日期期间合并。我想我需要一个循环来做到这一点。
我试图创建一个循环来查找 date1 和 date 2 之间的重叠间隔
df <- df[which(!duplicated(df$ ID)),]
for (i in 1:nrow(df)) {
tmp <- length(which(df $ID[i] & (df$date1[i] >df$date1 & df$date1[i]< df$date2) | (df$date2[i] < df$date2& df$date2[i]> df$date1))) >0
df$int[i]<- tmp
}
但是这不起作用。
确定重叠间隔后,我需要为每个新的开始日期和结束日期创建新行,并创建一个表示重叠的新字符。
我尝试识别重叠的另一个版本的循环:
for (i in 1:nrow(df)) {
if (df$ID[i]==IDs$ID){
tmp <- length(df, df$ ID[i]==IDs$ & (df$date1[i]> df$date1 & df$date1 [i]< df$date2 | df$date2[i] < df$date2 & df$date2[i]> df$date1)) >0
df$int[i]<- tmp
}
}
【问题讨论】:
-
你尝试过什么,你在哪里卡住了?
-
bioconductor 上的
IRanges包有一些很好的功能。 -
您的日期是一些不错的时间/日期数据格式还是字符串?我的意思是:基本思想是查看
date1[i1]>date1[i2] && date1[i1]<date2[i2]是否与date2[i1]相同。然后将两行合并。date1和date2分别设置为min和date1和date2。您对 >2 重叠间隔的问题:ERI 就是这种情况。您想要四个新行(ER、EI、RI 和 ERI)和一个新行 (ERI)?后者可能会产生一些冲突。我会用一些递归函数调用来解决它...... . -
嗨@daniel.neumann,我尝试了类似于您建议的方法来查找重叠日期,但没有成功。是的,日期采用“%Y-%m-%d”格式。是的,我想创建显示重叠日期的新行,以及字符组合(在我的数据中它们实际上是单词)以反映重叠的内容。
标签: r date overlap overlapping-matches