我正在寻找一种算法,分类(与字母)一组间隔根据他们的重叠.

  • 输出应将每个重叠的间隔与相同的字母相关联,从而构成唯一组.

  • 与多个组重叠的间隔将使用与每个唯一组对应的几个字母进行分类.

  • 不重叠的音程也构成了一个独特的组.

用图形表示,问题如下:

enter image description here

我在R区工作,我的间隔如下:

structure(list(Interval = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Start = c(5.3, 
6.5, 7.6, 7.8, 8, 8.3, 8.5, 8.7, 8.8, 9.9), End = c(7.5, 8.7, 
9.8, 10, 10.2, 10.5, 10.7, 10.9, 11, 12.1)), row.names = c(NA, 
-10L), spec = structure(list(cols = list(Interval = structure(list(), class = c("collector_double", 
"collector")), Start = structure(list(), class = c("collector_double", 
"collector")), End = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), delim = "\t"), class = "col_spec"), class = c("spec_tbl_df","tbl_df", "tbl", "data.frame"))

我认为ivs套餐可能有解决方案,但我不知道程序.

推荐答案

我认为这个函数可以满足您的需求.

label_overlaps <- function(data, Start = "Start", End = "End", 
                           label = "label", labs = letters) {
  data <- data[order(data[[Start]]), ]
  data[[label]] <- ""
  for(i in labs) {
    n <- which(data[[label]] == "")
    if(length(n) == 0) break
    n <- n[1]
    m <- which(data[[Start]] < data[[End]][n] & data[[End]] > data[[Start]][n])
    data[[label]][c(n, m)] <- paste0(data[[label]][c(n, m)], i)
  }
  if(any(!nzchar(data[[label]]))) warning("All labels exhausted")
  return(data)
}

使用方法非常简单:

label_overlaps(df)
#> # A tibble: 10 x 4
#>    Interval Start   End label
#>       <dbl> <dbl> <dbl> <chr>
#>  1        1   5.3   7.5 a    
#>  2        2   6.5   8.7 ab   
#>  3        3   7.6   9.8 b    
#>  4        4   7.8  10   bc   
#>  5        5   8    10.2 bc   
#>  6        6   8.3  10.5 bc   
#>  7        7   8.5  10.7 bc   
#>  8        8   8.7  10.9 bc   
#>  9        9   8.8  11   bc   
#> 10       10   9.9  12.1 c

如果我们使用与您的样本图像匹配的数据,我们会得到:

library(geomtextpath)

df <- data.frame(Interval = c(3, 2, 1, 3, 2, 2),
                 Start = c(1, 3, 7, 14, 15, 18.3),
                 End = c(4, 13, 10, 17, 17.7, 22))

ggplot(label_overlaps(df), aes(Start, Interval, xend = End, yend = Interval)) +
  geom_segment(linewidth = 9, lineend = "round") +
  geom_textsegment(aes(label = label, group = seq_along(label)), 
                   textcolour = "black", gap = FALSE, 
                   linewidth = 8, lineend = "round", color = "#bffec0") +
  coord_cartesian(clip = "off") +
  theme_void(base_size = 16) +
  theme(aspect.ratio = 1/8)

enter image description here

根据您的实际数据,我们可以得出以下结论:

ggplot(label_overlaps(df), aes(Start, Interval)) +
  geom_textsegment(aes(label = label, xend = End, yend = Interval, 
                       color = label), textcolour = "black", gap = FALSE, 
                   vjust = -1, linewidth = 6, lineend = "round") +
  scale_color_manual(values = c("red", "orangered", "orange",
                                "green4", "dodgerblue"), guide = "none") +
  theme_minimal(base_size = 16)

enter image description here

R相关问答推荐

如何判断某列中由某些行组成的百分比

从API中抓取R数据SON

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

根据R中两个变量的两个条件删除带有dspirr的行

使用gggrassure减少地块之间的空间

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

如何识别倒排的行并在R中删除它们?

跨列查找多个时间报告

扩展R中包含列表的数据框

将具有坐标列表列的三角形转换为多个多边形

有没有办法通过str_Detect()或其他字符串匹配函数来连接两个长度不等的数据帧?

快速合并R内的值

对R中的列表列执行ROW Mean操作

如何在内联代码中添加额外的空格(R Markdown)

如何在R中创建这些列?

如何在shiny 的应用程序 map 视图宣传单中可视化单点

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

子样本间系数检验的比较

如何编辑被动式数据表?

在分面的ggplot2条形图中对条形图进行排序,并省略每组未使用的系数级别