R 如果两个向量具有公共交点,则指定相同的索引
我需要一个与我的其他问题密切相关的问题的帮助 正如问题的标题所说,我想在向量中生成一个索引,链接列表中的不同向量,如果它们有交集,或者如果两者都与列表中的其他向量相交,等等 这是一个涉及图论/网络的问题-我想找到间接连接的向量 上面的问题解决了将两列视为数据帧的问题,但我不知道如何将其推广到元素长度不同的列表中 这是一个例子:R 如果两个向量具有公共交点,则指定相同的索引,r,igraph,R,Igraph,我需要一个与我的其他问题密切相关的问题的帮助 正如问题的标题所说,我想在向量中生成一个索引,链接列表中的不同向量,如果它们有交集,或者如果两者都与列表中的其他向量相交,等等 这是一个涉及图论/网络的问题-我想找到间接连接的向量 上面的问题解决了将两列视为数据帧的问题,但我不知道如何将其推广到元素长度不同的列表中 这是一个例子:list(1:3,3:5,5,6)应该给我c(1,1,1,2) 编辑: 我试着利用邻接矩阵的幂表示从一条边到另一条边的可能路径这一事实 find_connections
list(1:3,3:5,5,6)
应该给我c(1,1,1,2)
编辑:
我试着利用邻接矩阵的幂表示从一条边到另一条边的可能路径这一事实
find_connections <- function(list_vectors){
list_vectors <- list_vectors %>%
set_names(paste0("x", 1:length(list_vectors)))
x <- crossprod(table(stack(list_vectors)))
power <- nrow(x) - 2
x <- ifelse(x >= 1, 1, 0)
if(power > 0){
z <- accumulate(replicate(power, x, simplify = FALSE),
`%*%`, .init = x) %>%
reduce(`+`)
} else{
z <- x
}
z <- ifelse(z >= 1, 1, 0)
w <- z %>%
as.data.frame() %>%
group_by(across()) %>%
group_indices()
return(w)
}
查找连接这是一种方法。它为每个向量中的元素创建一个循环,然后使用与前面答案相同的技巧来查找簇
library(data.table)
library(igraph)
x <- list(1:3, 3:5, 5, 6)
dt <- rbindlist(lapply(x,
function(r) data.table(from = r, to = shift(r, -1, fill = r[1]))))
dg <- graph_from_data_frame(dt, directed = FALSE)
unname(sapply(x, function(v) components(dg)$membership[as.character(v[1])]))
#> [1] 1 1 1 2
库(data.table)
图书馆(igraph)
我想你可能需要再解释一下。例如,6
与零相交,为什么它的值为2?也许提供更多的样品/测试将有助于展示模式。6接收并不意味着什么。我唯一关心的是它得到的值不同于其他Entries谢谢!你能稍微调整一下吗?如果我对列表(1:5,1:4,6,5,8)
运行此命令,我会得到1 2 1 NA
而不是像1 2 1 3
这样的东西,这很好!我将更新答案以避免出现该问题。