列表列表:计算每对列表的列表重叠,并将重叠存储在矩阵中

时间:2020-11-09 13:55:32

标签: r list

我有一个看起来像这样的列表列表:

dt

id1: chr [1:2340]   "1234", "123456", "536475869"  ...
id2: chr [1:120000] "342567586" , "23564753186" , "67545" ....
id3: chr [1:300500] ...
id4: chr [1:70000]  ...

我想要获得的是每两对列表(a,b),我想要获得a&b的重叠除以n。的对象。

为此,我创建了以下功能:

overlap <- function(dt ,first_list, second_list){
x <- intersect(dt[first_list], dt[second_list])
if (length(x)==0){x<-0} else{x<-length(x[[1]]) } 
first_length <- length(dt[[first_list]])
x <- x/first_length 
return(x)
}

该函数工作正常,我想将结果存储在一个方阵中,其中每个原始和列对应于一个列表(因此[1,1]是dt中list1和list1之间的重叠,[1,2]是list1和list2之间的重叠等等)

overlap_matrix <- matrix(, nrow = length(dt), ncol = length(dt))
我虽然对行和列使用for循环来填充所有重叠的矩阵,但是问题是代码每次都会崩溃。我认为这是因为列表很大,每个列表最多包含1.000.000个元素。我只尝试了6个列表,但无论如何它还是很烂。还有其他方法可以更有效地获取我想要的东西吗?

for (r in 1:length(dt)) {
  for (c in 1:length(dt)) {
    if(r==c){ overlap_matrix[r,c] <- 1  }else{overlap_matrix[r,c]<- overlap(dt, r,c)}    
  }

 

最终结果如下:

overlap_matrix

     1    2     3    4

1    1    0.2   0.4 ...
2    0    1     0.7
3    0.2  0.4   1
4    ...

0 个答案:

没有答案