合并在R中共享元素的列出向量
谢谢你的帮助。我正在尝试编写一个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
> 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