gpt4 book ai didi

r - 从头开始查找向量重叠

转载 作者:行者123 更新时间:2023-12-01 14:30:30 26 4
gpt4 key购买 nike

我正在寻找一种有效的方法来获取 R 中两个向量之间相同的前 k 元素。

例如:

orderedIntersect(c(1,2,3,4), c(1,2,5,4))
# [1] 1 2
orderedIntersect(c(1,2,3), c(1,2,3,4))
# [1] 1 2 3

这与相交行为相同,但应删除第一个不匹配之后的任何值。

我也希望这适用于字符串。

到目前为止,我的解决方案是这样的:

orderedIntersect <- function(a,b) {
a <- as.vector(a)
NAs <- is.na(match(a, as.vector(b)))
last <- ifelse(any(NAs), min(which(NAs)) - 1, length(a))
a[1:last]
}

我对必须迭代 n 个输入元素 6 次这一事实感到困扰:match, is.na anywhichmin 以及子集 []

显然,编写外部 C 函数(带有 for 循环和 break)会更快,但我想知道如果有什么聪明的 R 技巧我可以在这里使用。

最佳答案

您可以比较向量的值,并在达到第一个 FALSE 时删除元素:

orderedIntersect <- function(a,b) {
# check the lengths are equal and if not, "cut" the vectors so they are (to avoid warnings)
l_a <- length(a) ; l_b <- length(b)
if(l_a != l_b) {m_l <- min(l_a, l_b) ; a <- a[1:m_l] ; b <- b[1:m_l]}
# compare the elements : they are equal if both are not NA and have the same value or if both are NA
comp <- (!is.na(a) & !is.na(b) & a==b) | (is.na(a) & is.na(b))
# return the right vector : nothing if the first elements do not match, everything if all elements match or just the part that match
if(!comp[1]) return(c()) else if (all(comp)) return(a) else return(a[1:(which(!comp)[1]-1)])
}

orderedIntersect(c(1,2,3,4), c(1,2,5,4))
#[1] 1 2
orderedIntersect(c(1,2,3), c(1,2,3,4))
#[1] 1 2 3
orderedIntersect(c(1,2,3), c(2,3,4))
#NULL

关于r - 从头开始查找向量重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33097197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com