在向量元素中查找模式

时间:2015-03-27 06:02:50

标签: r pattern-matching similarity

我有一些像

这样的载体
A1 = c(A,B,C)
A2 = c(A,B,C)
A3 = c(A,B,NA)
A4 = c(NA,B,C)

现在我想要一些可以给我结果的东西:

Pattern (A,B,C) occurs 2 times.
Pattern (A,B) occurs 3 times.
Pattern (B,C) occurs 3 times.

现在我拿走每个矢量并比较它们。通过这种方式,我可以找到A,B,C模式而不是A,B或B,C模式。

是否有任何包装或某些数学模型可以做到?

EDIT1: 由于某些机密性问题,我无法发布代码,但实际上我所做的是将第一个向量与第二个进行比较,然后将第三个进行比较,依此类推使用%in%。它给了我一个真假的矩阵。然后我重复了所有向量的过程。最后,我发现了矩阵中最大密度的真实位置。

编辑2: 我知道先验算法和arules包,但先验不是很有效。

2 个答案:

答案 0 :(得分:0)

它可能会变短但这是一种方法:

A1 = c("A","B","C")
A2 = c("A","B","C")
A3 = c("A","B", NA)
A4 = c(NA,"B","C")

a <- lapply(list(A1, A2, A3, A4), function(x){
   x[is.na(x)] <- " "
   paste0(x, collapse="")
})

pattern <- c("B", "C")
pattern_2 <- paste0(pattern, collapse="")

sum(sapply(a, function(x){grepl(pattern_2, x)}))

答案 1 :(得分:0)

非常糟糕的方法(很多循环)。它接近你要找的东西。

library(combinat)

A1 = c("A","B","C")
A2 = c("A","B","C")
A3 = c("A","B", NA)
A4 = c(NA,"B","C")
df <- data_frame(A1, A2, A3, A4)
df[is.na(df)] <- " "

a <- sapply(1:dim(df)[1], function(x) {combn(unique(unlist(apply(df, 1, unique))), x)})

pattern <- unlist(lapply(a, function(x){
  apply(x, 2, function(y){paste0(y, collapse="_")})
}))

a <- lapply(list(A1, A2, A3, A4), function(x){
  x[is.na(x)] <- " "
  paste0(x, collapse="_")
})

df2 <- sapply(a, function(x){sapply(pattern, function(z){grepl(z, x)})})
pattern <- rownames(df2)

occurs <- apply(df2, 1, sum)
pattern <- gsub(" ", "NA", pattern)


pattern <- gsub("_", ", ", pattern)
# pattern <- strsplit(pattern, "_")

for(i in 1:length(pattern)){
  cat("Pattern (", pattern[[i]], ") occurs ", occurs[i], " times\n")
}