在每两个列表元素中绘制交集
Plot the intersection in every two list elements
给定一个包含 16 个元素的列表,其中每个元素都是一个命名的数值向量,我想绘制每 2 个元素之间的名称交集的长度。那是;元素 1 与元素 2 的交集,元素 3 与元素 4 的交集,等等
虽然我可以用一种非常乏味、低吞吐量的方式来做这件事,但我将不得不重复这种分析,所以我想要一种更程序化的方式来做这件事。
例如,前 2 个列表元素的前 5 个条目是:
topGenes[[1]][1:5]
3398 284353 219293 7450 54658
2.856363 2.654106 2.653845 2.635599 2.626518
topGenes[[2]][1:5]
1300 64581 2566 5026 146433
2.932803 2.807381 2.790484 2.739735 2.705030
在这里,第一行数字是基因 ID,我想知道每对向量(一个处理重复)有多少共同点,比如前 100 个。
我试过按以下方式使用 lapply():
vectorOfIntersectLengths <- lapply(topGenes, function(x) lapply(topGenes, function(y) length(intersect(names(x)[1:100],names(y)[1:100]))))
这似乎只对前两个元素进行操作; topGenes[[1]] & topGenes[[2]].
我也一直在尝试使用 for() 循环来完成此操作,但我不确定如何编写它。类似这样的事情:
lengths <- c()
for(i in 1:length(topGenes)){
lens[i] <- length(intersect(names(topGenes[[i]][1:200]),
names(topGenes[[i+1]][1:200])))
}
这个returns一个'subscript out of bounds'错误,我不太明白。
非常感谢您的帮助!
这是您要找的吗?
# make some fake data
set.seed(123)
some_list <- lapply(1:16, function(x) {
y <- rexp(100)
names(y) <- sample.int(1000,100)
y
})
# identify all possible pairs
pairs <- t( combn(length(some_list), 2) )
# note: you could also use: pairs <- expand.grid(1:length(some_list),1:length(some_list))
# but in addition to a-to-b, you'd get b-to-a, a-to-a, and b-to-b
# get the intersection of names of a pair of elements with given indices kept for bookkeeping
get_intersection <- function(a,b) {
list(a = a, b = b,
intersection = intersect( names(some_list[[a]]), names(some_list[[b]]) )
)
}
# get intersection for each pair
intersections <- mapply(get_intersection, a = pairs[,1], b = pairs[,2], SIMPLIFY=FALSE)
# print the intersections
for(indx in 1:length(intersections)){
writeLines(paste('Intersection of', intersections[[indx]]$a, 'and',
intersections[[indx]]$b, 'contains:',
paste( sort(intersections[[indx]]$intersection), collapse=', ') ) )
}
给定一个包含 16 个元素的列表,其中每个元素都是一个命名的数值向量,我想绘制每 2 个元素之间的名称交集的长度。那是;元素 1 与元素 2 的交集,元素 3 与元素 4 的交集,等等
虽然我可以用一种非常乏味、低吞吐量的方式来做这件事,但我将不得不重复这种分析,所以我想要一种更程序化的方式来做这件事。
例如,前 2 个列表元素的前 5 个条目是:
topGenes[[1]][1:5]
3398 284353 219293 7450 54658
2.856363 2.654106 2.653845 2.635599 2.626518
topGenes[[2]][1:5]
1300 64581 2566 5026 146433
2.932803 2.807381 2.790484 2.739735 2.705030
在这里,第一行数字是基因 ID,我想知道每对向量(一个处理重复)有多少共同点,比如前 100 个。
我试过按以下方式使用 lapply():
vectorOfIntersectLengths <- lapply(topGenes, function(x) lapply(topGenes, function(y) length(intersect(names(x)[1:100],names(y)[1:100]))))
这似乎只对前两个元素进行操作; topGenes[[1]] & topGenes[[2]].
我也一直在尝试使用 for() 循环来完成此操作,但我不确定如何编写它。类似这样的事情:
lengths <- c()
for(i in 1:length(topGenes)){
lens[i] <- length(intersect(names(topGenes[[i]][1:200]),
names(topGenes[[i+1]][1:200])))
}
这个returns一个'subscript out of bounds'错误,我不太明白。
非常感谢您的帮助!
这是您要找的吗?
# make some fake data
set.seed(123)
some_list <- lapply(1:16, function(x) {
y <- rexp(100)
names(y) <- sample.int(1000,100)
y
})
# identify all possible pairs
pairs <- t( combn(length(some_list), 2) )
# note: you could also use: pairs <- expand.grid(1:length(some_list),1:length(some_list))
# but in addition to a-to-b, you'd get b-to-a, a-to-a, and b-to-b
# get the intersection of names of a pair of elements with given indices kept for bookkeeping
get_intersection <- function(a,b) {
list(a = a, b = b,
intersection = intersect( names(some_list[[a]]), names(some_list[[b]]) )
)
}
# get intersection for each pair
intersections <- mapply(get_intersection, a = pairs[,1], b = pairs[,2], SIMPLIFY=FALSE)
# print the intersections
for(indx in 1:length(intersections)){
writeLines(paste('Intersection of', intersections[[indx]]$a, 'and',
intersections[[indx]]$b, 'contains:',
paste( sort(intersections[[indx]]$intersection), collapse=', ') ) )
}