如何将区间(开始值和结束值)解析为逻辑矩阵?

How can I resolve an interval (start- and end-value) to a logical matrix?

我想从具有时间列和具有起始值和结束值的两列的数据帧中构建具有定义大小(例如 3x5)的逻辑矩阵。在 RL 中,矩阵将具有非常多的行和数千列。进一步的目标是用数据绘制热图(参见示例)。

在 R 中获取逻辑矩阵的最有效方法是什么? (因此 从 »intervals_by_time« 到 »data« 的步骤) 列名与 »data« 无关。

library(magrittr)

intervals_by_time <- tibble::tibble(epoch = c(1, 2, 3), interval_start = c(1, 1, 5), interval_end = c(3, 5, 5))


data <- tibble::tibble(epoch = c(1, 2, 3),
                       pos_01 = c(TRUE, TRUE, FALSE), 
                       pos_02 = c(TRUE, TRUE, FALSE),
                       pos_03 = c(TRUE, TRUE, FALSE),
                       pos_04 = c(FALSE, TRUE, FALSE),
                       pos_05 = c(FALSE, TRUE, TRUE)
                       )

data_plot <- data %>% tidyr::pivot_longer(cols = 2:6, names_to = "pos", values_to = "val")


ggplot2::ggplot(data = data_plot, ggplot2::aes(x = pos, y = epoch, fill = val)) +
  ggplot2::geom_tile()

reprex package (v2.0.1)

于 2022-02-23 创建

创建一个 FALSE 值向量,template 然后为输入的每一行填写 TRUE 值。

template <- rep(FALSE, max(intervals_by_time$interval_end))
repl <- function(x) replace(template, x[2]:x[3], TRUE)
m <- t(apply(intervals_by_time, 1, repl)); m
##       [,1]  [,2]  [,3]  [,4]  [,5]
## [1,]  TRUE  TRUE  TRUE FALSE FALSE
## [2,]  TRUE  TRUE  TRUE  TRUE  TRUE
## [3,] FALSE FALSE FALSE FALSE  TRUE

图形

尝试热图或对于更大的矩阵尝试图像。

heatmap(+m, Rowv = NA, Colv = NA, revC = TRUE, col = 2:3, scale = "none")

nr <- nrow(m)
image(t(m[nr:1,]), useRaster = TRUE, axes = FALSE, col = 2:3)

或者用ggplot2给出气球图或者方块图

library(ggplot2)

ggplot(as.data.frame.table(m), aes(Var2, Var1, col = Freq)) + 
  geom_point(cex = 20) + 
  scale_y_discrete(limits = rev)

ggplot(as.data.frame.table(m), aes(Var2, Var1, fill = Freq)) + 
  geom_tile(col = "black") + 
  scale_y_discrete(limits = rev)

另一个选项是 plot.matrix 来自 plot.matrix 包。

library(plot.matrix)
plot(m, col = 2:3, mar = c(4, 4, 4, 4))