如何匹配R中两个向量的逆序

时间:2016-09-15 05:57:21

标签: r pattern-matching

我有两个载体

key.vec <- c("apple:ball", "ball:cat","dog:ear")

vec2 <- c("ball:apple","cat:cat","cat:ball","ball:cat","apple:ball")

我现在想使用key.vec查找vec2中的项目并获取项目,无论其顺序是:分隔。

因此,如果我尝试这样的vec2[match(key.vec,vec2)]

,结果应该如下所示

结果:

"apple:ball", "ball:cat", "ball:apple","cat:ball"

2 个答案:

答案 0 :(得分:4)

这应该有用。

按每个字符拆分所有向量,然后查找每个字符的频率(key.vec)。接下来发现目标向量(vec2)中是否存在每个字符的相同频率。这将有助于处理这两种模式。

vec2[lapply(strsplit(vec2, ""), table) %in% lapply(strsplit(key.vec, ""), table)]

#[1] "ball:apple" "cat:ball"   "ball:cat"   "apple:ball"

答案 1 :(得分:3)

您可以使用sub,如下所示:

full.key.vec <- c(key.vec, sub("(.*):(.*)", "\\2:\\1", key.vec))
ind <- vec2 %in% full.key.vec
vec2[ind]

或者在一行中:

vec2[vec2 %in% c(key.vec, sub("(.*):(.*)", "\\2:\\1", key.vec))]

为什么?

\\1\\2被称为反向引用。他们匹配第一/第二正则表达组。因此(.*):(.*)匹配字符串如下:(apple):(ball)。因此\\2:\\1变为\\2=ball:\\1=apple。有关详细信息,请参阅:http://www.regular-expressions.info/backref.html