我有一个看起来像这样的列表列表:
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 ...