如果我有一个载体列表,如下面的
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)
答案 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;
}
第三个元素的顺序与列表的顺序不同,但从描述问题的方式来看,顺序并不是真正相关的。