获取两个向量的唯一值,并保持两个原始向量的顺序

时间:2020-09-14 07:07:56

标签: r

我试图得到一个两个向量的唯一元素的向量,该向量尊重两个原始向量的顺序。

向量均从更长的“隐藏”向量中采样,该向量仅包含唯一条目(即不允许重复),从而确保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”

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

任何提示将不胜感激。

2 个答案:

答案 0 :(得分:4)

您可以从uniquev1中获得v2,并在matchv1上使用v2对其进行重新排序,并重复此操作直至无变化发生。

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"

或者,您可以获取v1v2的重叠字母,然后将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"

答案 1 :(得分:1)

对于此示例,下一个代码有效。首先必须定义辅助向量w1w2,具体取决于哪个向量具有第一个公共元素,而另一个向量w则要在其上按顺序附加缺少的元素。

使用for循环会更清楚,这可以避免这段繁琐的代码,但是起初,它会更快,更短。

w <- w1 <- unlist(ifelse(intersect(v1,v2)[1] == v1[1], list(v2), list(v1)))
w2 <- unlist(ifelse(intersect(v1,v2)[1] == v1[1], list(v1), list(v2)))
unique(lapply(setdiff(w2,w1), function(elmt) w <<- append(w, elmt, after = match(w2[match(elmt,w2)-1],w)))[[length(setdiff(w2,w1))]])
[1] "Z" "A" "T" "F" "Q" "D"