合并在R中共享元素的列出向量

合并在R中共享元素的列出向量,r,list,vector,merge,R,List,Vector,Merge,谢谢你的帮助。我正在尝试编写一个R函数,它将获取一个包含数字向量的列表,并合并所有共享数字的列表元素。我不确定我是否正确地解释了这个问题,所以我希望你不介意我用一个类比。示例列表如下所示: > list(c(1, 6), c(2, 3), c(3, 2), c(4, 5, 6), c(5, 4), c(1, 6, 4)) [[1]] [1] 1 6 [[2]] [1] 2 3 [[3]] [1] 3 2 [[4]] [1] 4 5 6 [[5]] [1] 5 4 [[6]] [1

谢谢你的帮助。我正在尝试编写一个R函数,它将获取一个包含数字向量的列表,并合并所有共享数字的列表元素。我不确定我是否正确地解释了这个问题,所以我希望你不介意我用一个类比。示例列表如下所示:

> list(c(1, 6), c(2, 3), c(3, 2), c(4, 5, 6), c(5, 4), c(1, 6, 4))
[[1]]
[1] 1 6

[[2]]
[1] 2 3

[[3]]
[1] 3 2

[[4]]
[1] 4 5 6

[[5]]
[1] 5 4

[[6]]
[1] 1 6 4
如果您想象6个村庄,列表将显示哪些村庄通过道路连接。所以列表元素[[1]]显示村庄1连接到村庄1和村庄6。列表元素[[6]]显示6连接到村庄1、村庄6和村庄4。等等我希望我的输出显示哪些村庄通过相同的“道路网络”连接,因此村庄1显然与6位于同一网络中,但它也应该与4和5分组,因为它通过6和4连接到它们。2和3应分别分组,因为它们不共享到其他网络的连接

我已经设法拼凑出了一个解决方案,但它非常不雅观,而且运行时间太长,无法获得更复杂的输入。我的解决办法是:

input <- list(c(1, 6), c(2, 3), c(3, 2), c(4, 5, 6), c(5, 4), c(1, 6, 4))
remaining <- 1:6                  # counter where i can store which numbers have not yet been evaluated
output <- vector("list", 6)

branch <- function(x) {           # function to recursively evaluate vector elements
  for(y in x) {                                           # repeat for each vector element
    if(y %in% remaining) {                                # check if the list element corresponding to y has been evaluated
      output[[i]] <- append(output[[i]], input[[y]])      # assign list element y to output element i
      assign("output", output, envir = globalenv())       #assign output to global environment
      remaining <- remaining[remaining != y]              # remove y from future evaluations
      assign("remaining", remaining, envir = globalenv()) # assign remaining to global environment
      branch(input[[y]])                                  # evaluate branches further from y
    }
  }
}

for(i in 1:6) {                    # repeat for each element of list
  if(i %in% remaining) {           # check if list element i has already been evaluated
    branch(input[[i]])             # evaluate list element
  }
}

output <- output[-which(sapply(output, is.null))]         # remove null elements from list
output <- lapply(output, unique)                          # remove redundant elements from vectors

output

> output
[[1]]
[1] 1 6 4 5

[[2]]
[1] 2 3

input如评论中所述,您的问题基本上是需要构建一个图并找到其组件-因此
igraph
非常有用

事实证明,您的数据已经或多或少采用了正确的格式,因此您可以执行以下操作:

library(igraph)

input <- list(c(1, 6), c(2, 3), c(3, 2), c(4, 5, 6), c(5, 4), c(1, 6, 4))

# mode = "all" so that connections are treated as two-way,
#   i.e. an 'undirected' graph
g = graph_from_adj_list(input, mode = "all")
comp = components(g)
groups(comp)
您还可以使用
plot(g)
轻松实现图形可视化:


PS:这并不影响这个简单的示例,但图形确实包含一个循环,其中1连接到自身-您可能需要从输入数据中过滤这些自连接。

您正在构建一个图形-村庄是节点,道路是边。像
igraph
这样的图形库将使您的分析更加容易,您只需首先将数据移动到
igraph
所需的格式。非常感谢您的指导!现在对我来说这是一天的结束,但我会在明天早上调查。
$`1`
[1] 1 4 5 6

$`2`
[1] 2 3