在R中高效地处理集合 背景:
我正在处理R中的一个组合问题。对于给定的集合列表,我需要在不产生重复项的情况下生成每个集合的所有对 例如:在R中高效地处理集合 背景:,r,performance,R,Performance,我正在处理R中的一个组合问题。对于给定的集合列表,我需要在不产生重复项的情况下生成每个集合的所有对 例如: initial_list_of_sets <- list() initial_list_of_sets[[1]] <- c(1,2,3) initial_list_of_sets[[2]] <- c(2,3,4) initial_list_of_sets[[3]] <- c(3,2) initial_list_of_sets[[4]] <- c(5,6,7)
initial_list_of_sets <- list()
initial_list_of_sets[[1]] <- c(1,2,3)
initial_list_of_sets[[2]] <- c(2,3,4)
initial_list_of_sets[[3]] <- c(3,2)
initial_list_of_sets[[4]] <- c(5,6,7)
get_pairs(initial_list_of_sets)
# should return (1 2),(1 3),(2 3),(2 4),(3 4),(5 6),(5 7),(6 7)
initial\u list\u of_set也许您可以将get\u pairs
函数重写为如下内容:
myFun <- function(inlist) {
unique(do.call(rbind, lapply(inlist, function(x) t(combn(sort(x), 2)))))
}
对我接受你的回答。我想了解R在幕后是如何做到如此之快的……在您的循环中,每当有新的价值需要添加时,您都会增加列表,这通常不是很有效。我还尝试在R中使用一些已经优化的函数(lappy
,unique
,例如)。
myFun <- function(inlist) {
unique(do.call(rbind, lapply(inlist, function(x) t(combn(sort(x), 2)))))
}
n <- 100
set.seed(1)
x <- sample(2:8, n, TRUE)
initial_list_of_sets <- lapply(x, function(y) sample(100, y))
system.time(get_pairs(initial_list_of_sets))
# user system elapsed
# 1.964 0.000 1.959
system.time(myFun(initial_list_of_sets))
# user system elapsed
# 0.012 0.000 0.014
myFun <- function(inlist) {
temp <- unique(do.call(rbind, lapply(inlist, function(x) t(combn(sort(x), 2)))))
lapply(1:nrow(temp), function(x) temp[x, ])
}