首页 > 解决方案 > 绘制时间间隔的重叠

问题描述

我有以下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 包并将日期转换为整数(如此处使用的(链接)),但对我不起作用。

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)

有人有使用其他软件包的另一种解决方案吗?

标签: rggplot2dplyriranges

解决方案


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

为了解决这个问题,我会在进行分析之前删除 df 中所有带有 NA 的行。

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

删除 NA 的说明和其他方法请参阅在 data.frame 中删除具有全部或部分 NA(缺失值)的行

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

例子:

str <- "2006-06-26"


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

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

推荐阅读