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”
我知道这种情况是完全确定的(这两个向量确实完全定义了所有元素的顺序),但是在某些情况下这还不够。在这种情况下,尊重两组排序的任何排列都将是一个令人满意的解决方案。
任何提示将不胜感激。
解决方案
您可以使用on来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"
或者,您可以获取 and 的重叠字母,v1
然后将andv2
的子集连接到此锚点: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"
推荐阅读
- android - Android Studio 中的 Javadoc View 等效项
- bash - 如何从 PATH 中具有相同名称的脚本调用 bash 函数
- sql - 在未执行的条件内获取 SQL 语法错误
- javascript - 您如何每次计算父 div 高度(当用户多次使用新浏览器时)
- java - Android:用于编译的JDK版本对最低支持的api有影响吗?
- android - 在 Android 中使用自定义 XML 元素时,我收到一条警告,指出不允许使用该元素。我该如何妥善处理?
- java - 使用 JPA 从具有 JOIN 的表中获取 2000 行在其他 2 个表上需要更多时间
- ios - 快速传递参数?
- python-3.x - 为循环保存图像
- spring - 如何以角度处理会话到期?