R 向量链表
如果我有如下向量列表R 向量链表,r,tidyverse,purrr,R,Tidyverse,Purrr,如果我有如下向量列表 list.x <- list(1:2, 1:3, 3:4, 5, 5:6) 今天我需要改变一下节奏,所以我决定试着用base R来回答这个问题。下面是: 首先,我创建了一个函数,如果两个向量相交,则将它们合并,如果不相交,则只返回第一个向量: expand.if.toucing <- function(vector1, vector2) { i = intersect(vector1, vector2); if (NROW(i) > 0)
list.x <- list(1:2, 1:3, 3:4, 5, 5:6)
今天我需要改变一下节奏,所以我决定试着用base R来回答这个问题。下面是: 首先,我创建了一个函数,如果两个向量相交,则将它们合并,如果不相交,则只返回第一个向量:
expand.if.toucing <- function(vector1, vector2) {
i = intersect(vector1, vector2);
if (NROW(i) > 0)
union(vector1, vector2)
else
vector1;
}
expand.if.toucing 0)
联合(矢量1,矢量2)
其他的
向量1;
}
然后我制作了一个函数,将向量列表中的一个元素与另一个元素合并:
list.reduce <- function (lst) {
for(v1 in 1:NROW(lst))
for (v2 in 1:NROW(lst)) {
if (v1 == v2)
next;
prevLength <- NROW(lst[[v1]]);
lst[[v1]] <- expand.if.toucing(lst[[v1]], lst[[v2]]);
newLength <- NROW(lst[[v1]]);
if (newLength == prevLength)
next;
return(lst[-v2]);
}
lst;
}
list.reduce今天我需要改变一下节奏,所以我决定试着用base R来回答这个问题。下面是:
首先,我创建了一个函数,如果两个向量相交,则将它们合并,如果不相交,则只返回第一个向量:
expand.if.toucing <- function(vector1, vector2) {
i = intersect(vector1, vector2);
if (NROW(i) > 0)
union(vector1, vector2)
else
vector1;
}
expand.if.toucing 0)
联合(矢量1,矢量2)
其他的
向量1;
}
然后我制作了一个函数,将向量列表中的一个元素与另一个元素合并:
list.reduce <- function (lst) {
for(v1 in 1:NROW(lst))
for (v2 in 1:NROW(lst)) {
if (v1 == v2)
next;
prevLength <- NROW(lst[[v1]]);
lst[[v1]] <- expand.if.toucing(lst[[v1]], lst[[v2]]);
newLength <- NROW(lst[[v1]]);
if (newLength == prevLength)
next;
return(lst[-v2]);
}
lst;
}
list.reduce似乎是一个图论问题<代码>igraph
可能有什么东西。您的列表定义了边,您希望在每个连接的组件中找到节点。实际上,我甚至建议。您只需创建图形对象,在其上运行igraph::components
,并按照您的要求格式化结果。谢谢,我需要了解图形对象。如果我的向量列表是一个字符向量列表,你知道这是否可行吗?我知道在一个数字列表和一个字符列表之间进行转换是非常简单的,所以这不重要。如果是的话,就转换。看起来像是一个图论问题<代码>igraph
可能有什么东西。您的列表定义了边,您希望在每个连接的组件中找到节点。实际上,我甚至建议。您只需创建图形对象,在其上运行igraph::components
,并按照您的要求格式化结果。谢谢,我需要了解图形对象。如果我的向量列表是一个字符向量列表,你知道这是否可行吗?我知道在一个数字列表和一个字符列表之间进行转换是非常简单的,所以这不重要。如果有,就转换。
replace.with.clusters <- function(lst, clusters) {
for(l in 1:NROW(lst))
for(c in 1:NROW(clusters)) {
lst[[l]] <- expand.if.toucing(lst[[l]], clusters[[c]]);
next;
}
lst;
}
list.x <- list(1:2, 1:3, 3:4, 5, 5:6)
clusters <- clusterize(list.x);
replace.with.clusters(list.x, clusters);
# Outputs the following:
#
# [[1]]
# [1] 1 2 3 4
#
# [[2]]
# [1] 1 2 3 4
#
# [[3]]
# [1] 3 4 1 2
#
# [[4]]
# [1] 5 6
#
# [[5]]
# [1] 5 6