【问题标题】:Get the unique values of two vectors keeping the order of both original获取两个向量的唯一值,保持两个原始的顺序
【发布时间】:2020-09-14 07:07:56
【问题描述】:

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

向量都是从一个较长的“隐藏”向量中采样的,该向量仅包含唯一条目(即不允许重复),这确保 v1 和 v2 具有兼容的顺序(即 v1

顺序是任意的,所以我不能使用任何简单的 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”

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

任何提示将不胜感激。

【问题讨论】:

  • 我相信不是。每个向量定义一个顺序并且两者都是兼容的。在v2 中有一个Q &lt; D,所以在最后一个向量中应该有Q &lt; D
  • @iago。谢谢,确实是这样。应保持所有向量中的相对顺序。
  • 抱歉,问题没有明确说明。例如,为什么在您想要的解决方案中将“Q”放在“D”之前? v2 优先于 v1 吗?举个简单的例子,如果你有 v1
  • @AdrianTompkins 正如我上面所说的,任何向量都没有优先级。该问题要求保持 both 原始向量的顺序,因此您的 v1v2 不是可能的原始向量,因为它们的顺序不兼容。
  • 所以事实上,问题本质上是 v1 和 v2 是来自第三个“隐藏”较长向量的子样本,该向量仅包含唯一条目。这将确保两个向量具有兼容的顺序并且不允许重复。 :-)

标签: r


【解决方案1】:

您可以从 v1v2 获取 unique 并在 v1v2 上使用 match 并重复此操作,直到没有发生任何变化。

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"

【讨论】:

    【解决方案2】:

    对于此示例,下一个代码有效。首先必须定义辅助向量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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多