【问题标题】:Is there any way to do clustering or sorting of file according to two numeric range value columns?有没有办法根据两个数值范围值列对文件进行聚类或排序?
【发布时间】:2022-08-02 18:01:18
【问题描述】:

我有一个大文件,我尝试找到一种方法来根据数字范围内的两个数字列对数据进行排序或聚类,但我找不到关于我的问题的正确或合适的函数。你能否请知道如何帮助我的人。
提前致谢。

我的文件类似于此示例文件,但非常大,正如您在此示例中看到的那样,第一行和第二行就像交替数字(我的意思是之间没有任何间隙(序列号)),第三行和第四行也是如此,但是第五行和第六行不同,实际上相距甚远。因此,我想将第一个和第二个视为一个集群,将第三个和第四个视为一个集群,第五个和第六个作为两个不同的集群,最后有 4 行而不是 6 行,因为第 1,2 和 3,4 行都在一个范围内,中间没有任何差距。
示例文件:

df <- setDT(data.frame(name = c(\"chr1\", \"chr1\", \"chr1\", \"chr1\",\"chr1\",\"chr1\"), 
  start = c(8480001, 8480251, 10006251, 10006501,13910501,14841751), 
  end = c(8480250, 8480500, 10006500, 10006750,13910750,14842000),
  length = c(250, 250, 250, 250,250,250))) 

预期输出:

output <- setDT(data.frame(name = c(\"chr1\", \"chr1\", \"chr1\", \"chr1\"),
  start = c(8480001, 10006251, 13910501, 14841751), 
  end = c(8480250, 10006500, 13910750, 14842000), 
  length = c(250, 250, 250, 250))) 

在输出中,我只想拥有一个集群中的第一行,例如第 1 行用于 1 和 2。

再次感谢。

    标签: r data.table bioinformatics


    【解决方案1】:

    我们可以根据 'start' 和 'end' 的 lag 之间的差异创建一个组并取第一行

    library(data.table)
    df[df[, .I[1], cumsum(start - shift(end, fill = first(end)) > 1)]$V1]
    

    -输出

       name    start      end length
       <char>    <num>    <num>  <num>
    1:   chr1  8480001  8480250    250
    2:   chr1 10006251 10006500    250
    3:   chr1 13910501 13910750    250
    4:   chr1 14841751 14842000    250
    

    【讨论】:

      猜你喜欢
      • 2020-10-21
      • 1970-01-01
      • 2019-06-27
      • 2010-10-26
      • 2020-03-29
      • 2020-02-06
      • 2019-06-06
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多