绘制时间间隔的重叠

时间:2019-03-21 19:09:58

标签: r ggplot2 dplyr iranges

我有以下df

Id   a_min_date      a_max_date      b_min_date     b_max_date       c_min_date       c_max_date           d_min_date     a_max_date
1    2014-01-01      2014-01-10      2014-01-05     2014-01-15            NA               NA              2014-02-20       2014-05-01
2    2014-02-01      2014-02-10       NA              NA               2015-02-20       2015-03-01             NA               NA    

我通过ID添加了每个组(a,b,c,d)的间隔。首先,我将开始日期和结束日期转换为润滑间隔。 我想绘制间隔并计算每组结束与下一组开始之间的时间差(如果没有重叠)。 我尝试使用IRanges软件包并将日期转换为整数(如此处(link)所示),但对我不起作用。

ir <- IRanges::IRanges(start = as.integer((as.Date(df$a_min_date))), end = as.integer((as.Date(df$a_max_date))))
bins <- disjointBins(IRanges(start(ir), end(ir) + 1))
dat <- cbind(as.data.frame(ir), bin = bins)

ggplot(dat) + 
  geom_rect(aes(xmin = start, xmax = end,
                ymin = bin, ymax = bin + 0.9)) +
  theme_bw()

我的原始df出现此错误:

Error in .Call2("solve_user_SEW0", start, end, width, PACKAGE = "IRanges") : 
  solving row 1: range cannot be determined from the supplied arguments (too many NAs)

有人使用其他软件包有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

据我所知,IRanges是解决此问题的最佳软件包。 IRanges需要范围值(在这种情况下为日期)进行比较,并且不处理未定义的值(NA)

为解决此问题,我将在进行分析之前删除df中所有具有NA的行。

df <- df[complete.cases(df[ , 1:2]),]

说明和删除NA的其他方法,请参见Remove rows with all or some NAs (missing values) in data.frame

如果这不能解决问题,则可以将日期转换为整数。重要的是日期具有年月日格式,以确保正确的时间间隔。

示例:

str <- "2006-06-26"


splitted<- unlist(strsplit(str,"-"))
[1] "2006" "06"   "26"

result <- paste(splitted,collapse="")
[1] "20060626"