Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 向量链表_R_Tidyverse_Purrr - Fatal编程技术网

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