如果我有这样的载体:
vec1 <- c("a", "b", "c")
vec2 <- c("a", "b", "c", "d", "e")
我可以用
vec1 %in% vec2
TRUE TRUE TRUE
确定vec1中是否包含vec1。但是,我需要尊重相对顺序,而这种方法不会:
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")
答案 0 :(得分:3)
您可以将矢量折叠为正则表达式模式并使用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
答案 1 :(得分:1)
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