我试图得到一个两个向量的唯一元素的向量,该向量尊重两个原始向量的顺序。
向量均从更长的“隐藏”向量中采样,该向量仅包含唯一条目(即不允许重复),从而确保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”
我知道这种情况是完全确定的(两个向量确实完全定义了所有元素的顺序),但是在某些情况下这还不够。在那种情况下,任何尊重两组排序的排列都是令人满意的解决方案。
任何提示将不胜感激。
答案 0 :(得分:4)
您可以从unique
和v1
中获得v2
,并在match
和v1
上使用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"
或者,您可以获取v1
和v2
的重叠字母,然后将v1
和v2
的子集加入此锚点:
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)
对于此示例,下一个代码有效。首先必须定义辅助向量w1
,w2
,具体取决于哪个向量具有第一个公共元素,而另一个向量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"