R语言 如何通过不同行之间的值差异来分隔但不拆分数据框?

gv8xihay  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个很大的基因座数据框架,我试图根据相似的起止值按基因分组,例如,行与行之间的终值之差不应该超过2000,才能算作同一个基因。
Example Data Frame
| 开始|完|
| - ------|- ------|
| 五千|六千|
| 小行星12|一万三千|
它们应该构成两个不同的基因。
| 开始|完|
| - ------|- ------|
| 三万七千|三万八千|
| 小行星38500|小行星39000|
这些应该是相同的基因。
我试过通过创建一个结束值差异的索引并使用cumsum()来拆分 Dataframe ,但程序停止了。
一个月一个月一个月一个月一个月
这将返回一个具有相似起始值和结束值的 Dataframe 列表。
理想情况下,我想做的是能够将 Dataframe 分解为类似于cut函数的区间,而不必创建全新的 Dataframe 。然后,我能够在每个区间内工作。我相信这将与split函数一起工作,但程序似乎停止了。我相信这是由于我正在处理的数据量很大。

wnavrhmk

wnavrhmk1#

你在寻找这样的东西吗?如果是这样,我很乐意解释下面代码的工作原理。

library(data.table)
library(intervals)

DT <- fread("Start  End
            5000    6000
            12000   13000
            37000   38000
            38500   39000")

gap = 2000

DT.int <- as.data.table(
  intervals::close_intervals( 
    intervals::contract( 
      intervals::reduce( 
        intervals::expand( 
          intervals::Intervals(as.matrix(DT), type = "Z" ), 
          gap/2)
        ), 
      gap/2)
    )
  )
DT.int[, id := .I]
      
# join back the id
DT[DT.int, id := i.id, on = .(Start >= V1, End <= V2)][]

   Start   End id
1:  5000  6000  1
2: 12000 13000  2
3: 37000 38000  3
4: 38500 39000  3
tp5buhyn

tp5buhyn2#

DF上运行kmeans,如最后的注解中所示。我们假设可以有1到3个集群。根据需要进行更改。然后在下面显示手肘图上,2个集群似乎是一个不错的值,因此使用2个集群运行kmeans以获得分组向量。我们可以看到,聚类将前两行分配给了一个聚类,将后两行分配给了另一个聚类。

tot.within <- sapply(1:3, function(k) kmeans(x = DF, k)$tot.within)
plot(tot.within, type = "o") # see plot below

cbind(DF, group = kmeans(DF, 2, nstart = 25)$cluster)
##   Start   End group
## 1  5000  6000     2
## 2 12000 13000     2
## 3 37000 38000     1
## 4 38500 39000     1

注解

Lines <- "Start End
5000 6000
12000 13000
37000 38000
38500 39000"
DF <- read.table(text = Lines, header = TRUE)

相关问题