График перекрытия временных интервалов - PullRequest
1 голос
/ 21 марта 2019

У меня есть следующий 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    

Я добавил интервалы каждой группы (a, b, c, d) по ID. Во-первых, я преобразовал даты начала и окончания в интервалы смазки. Я хочу построить интервалы и рассчитать разницу во времени в днях между концом каждой группы и началом следующей группы, если нет совпадений. Я попытался использовать пакет 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)

У кого-то есть другое решение, использующее другие пакеты?

1 Ответ

0 голосов
/ 21 марта 2019

Насколько мне известно, IRanges - лучший пакет для решения этой проблемы.IRanges требует значений диапазона (в данном случае даты) для сравнения и не обрабатывает неопределенные значения (NA)

Чтобы решить эту проблему, я бы удалил все строки с NA в df перед выполнением анализа.

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

Объяснение и другие способы удаления NA см. Удаление строк со всеми или некоторыми NA (отсутствующими значениями) в data.frame .

Если это не решит проблему, выможет конвертировать даты в целые числа.Важно отметить, что даты имеют формат год-месяц-день, что приводит к правильным интервалам.

Пример:

str <- "2006-06-26"


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

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