在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)

我正在处理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)
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, ])
}