首页 > 解决方案 > 获取两个向量的唯一值,保持两个原始的顺序

问题描述

我正在尝试获取两个向量的唯一元素的向量,该向量尊重两个原始向量的顺序。

这些向量都是从一个较长的“隐藏”向量中采样的,该向量只包含唯一的条目(即不允许重复),这确保了 v1 和 v2 具有兼容的顺序(即 v1<-("Z","A",. ..) 和 v2<-("A","Z",...) 不能发生)。

顺序是任意的,所以我不能使用任何简单的 order() 或 sort()。下面的一个例子:

v1 <- c("Z", "A", "F", "D")
v2 <- c("A", "T", "F", "Q", "D")

期望的结果:

c("Z", "A", "T", "F", "Q", "D") or

进一步解释:v1建立关系“Z”<“A”<“F”<“D”,v2状态“A”<“T”<“F”<“Q”<D”所以满足v1的序列而v2是“Z”<“A”<“T”<“F”<“Q”<“D”

我知道这种情况是完全确定的(这两个向量确实完全定义了所有元素的顺序),但是在某些情况下这还不够。在这种情况下,尊重两组排序的任何排列都将是一个令人满意的解决方案。

任何提示将不胜感激。

标签: r

解决方案


您可以使用on来unique获取v1并使用它并重复此操作,直到没有发生任何变化。v2matchv1v2

x <- unique(c(v1, v2))
repeat {
  y <- x
  i <- match(v2, x)
  x[sort(i)] <- x[i]
  i <- match(v1, x)
  x[sort(i)] <- x[i]
  if(identical(x, y)) break;
}
x
#[1] "Z" "A" "T" "F" "Q" "D"

或者,您可以获取 and 的重叠字母,v1然后将andv2的子集连接到此锚点:v1v2

i <- v2[na.omit(match(v1, v2))]
j <- c(0, match(i, v2))
i <- c(0, match(i, v1))
unique(c(unlist(lapply(seq_along(i)[-1], function(k) {
  c(v1[head((i[k-1]:i[k]), -1)], v2[head((j[k-1]:j[k])[-1], -1)])
})), v1, v2))
#[1] "Z" "A" "T" "F" "Q" "D"

推荐阅读