链接矢量列表

时间:2017-06-27 20:24:48

标签: r tidyverse purrr

如果我有一个载体列表,如下面的

list.x <- list(1:2, 1:3, 3:4, 5, 5:6)

有没有办法用一个元素替换每个列表元素,该元素包含元素可以配对的所有其他值?

例如,第一个元素(list.x[[1]])将替换为1:4,因为元素2(list.x[[2]])显示2,也与3配对,元素3显示3也是与4.配对。

我想要实现的最终结果将是此列表

final.list <- list(1:4, 1:4, 1:4, 5:6, 5:6)

1 个答案:

答案 0 :(得分:0)

我今天需要改变节奏,所以我决定尝试使用基础R来回答这个问题。这就是:

首先,我创建了一个函数,如果它们相交,则将两个向量联合起来,如果不相交,则只返回第一个向量:

public void setDownload(DefaultStreamedContent download) {
        this.download = download;
    }

然后我创建了一个函数,将向量列表中的一个元素与另一个元素合并:

expand.if.toucing <- function(vector1, vector2) {

  i = intersect(vector1, vector2);

  if (NROW(i) > 0) 
    union(vector1, vector2) 
  else 
    vector1;

}

在此之后,我创建了一个函数,它合并了列表中可以合并的所有向量。这是一种原型聚类分析,因此我将其称为聚类:

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;

}

现在只需将原始列表中的每个元素替换为其关联的集群:

clusterize <- function (lst) {

  reduced = TRUE;

  while(reduced) {

    prevLength <- NROW(lst);

    lst <- list.reduce(lst);

    newLength <- NROW(lst);

    reduced <- prevLength != newLength;

  }

  lst;
}

你很高兴。两个主要功能是clusterize和replace.with.cluster。像这样使用它们:

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;

}

第三个元素的顺序与列表的顺序不同,但从描述问题的方式来看,顺序并不是真正相关的。