【问题标题】:How can I determine whether a vector contains another vector respecting order in R?如何确定一个向量是否包含另一个尊重 R 中顺序的向量?
【发布时间】:2018-04-23 18:33:55
【问题描述】:

如果我有这样的向量:

vec1 <- c("a", "b", "c")
vec2 <- c("a", "b", "c", "d", "e")

我可以使用

vec1 %in% vec2
TRUE TRUE TRUE

判断 vec1 是否包含在 vec2 中。但是,我需要尊重相对顺序,而这种方法不会:

vec3 <- c("e", "d", "c", "b", "a") 
vec 1 %in% vec3 #should return false because not in abc order
TRUE TRUE TRUE

如何确定一个向量是否包含在另一个向量中且两个向量中的相对顺序相同?谢谢!

编辑:向量是字符向量,但可能包含我关心的元素之间的其他元素。例如,我希望以下内容返回 TRUE:

vec1 <- c("a", "b", "c")
vec4 <- c("a", "x", "b", "c", "y")

【问题讨论】:

  • 您的实际向量是字符向量吗?如果是这样,最简单的方法可能是将paste 一起使用,然后使用grepgrepl

标签: r


【解决方案1】:

您可以将向量折叠成正则表达式模式并使用grepl

vec1 <- c("a", "b", "c")
vec2 <- c("a", "b", "c", "d", "e")
grepl(paste(vec1, collapse=".*"), paste(vec2, collapse=""))
# TRUE
vec3 <- c("e", "d", "c", "b", "a")
grepl(paste(vec1, collapse=".*"), paste(vec3, collapse=""))
# FALSE
vec4 <- c("a", "x", "b", "c", "y")
grepl(paste(vec1, collapse=".*"), paste(vec4, collapse=""))
# TRUE

编辑:根据 G5W 的评论,您可以添加分隔符,以防每个元素不是字符但可能是短字符串。分隔符将分解向量的条目

vec5 <- c("a", "b", "c")
vec6 <- c("ab", "c")
vec7 <- c("ab", "e", "c", "d")
grepl(paste(vec5, collapse="-.*"), paste(vec7, collapse="-"))
# FALSE
grepl(paste(vec6, collapse="-.*"), paste(vec7, collapse="-"))
# TRUE

【讨论】:

  • 这在字符串都是字母时有效,但如果字符串可能是“a”或“b”或“ab”则可能无效
  • 如果它们根本不是字符串而是任意对象怎么办?
  • @JackBrookes 有点超出帖子的范围?我当然不会提倡我的答案是对每个数据对象的包罗万象
  • 也许可以,但标题不表示字符串,因此该解决方案可能无法满足到达这里的搜索者
  • @JackBrookes 希望这个评论部分足以发出警告
【解决方案2】:

match 函数返回一个向量在另一个向量中的顺序。然后,当且仅当您寻求的“相对顺序”存在时,该结果的顺序差异才会严格为正。

all(vec1 %in% vec4) & all(diff(match(vec1, vec4)) >0 )
[1] TRUE
# also passes the additonal tests
 all(vec5 %in% vec7) & all(diff(match(vec5, vec7)) >0 )
#[1] FALSE
 all(vec6 %in% vec7) & all(diff(match(vec6, vec7)) >0 )
#[1] TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2018-04-24
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2013-03-27
    • 2021-12-06
    相关资源
    最近更新 更多