在 R 中匹配和计算字符串

Matching and Counting Strings of Characters in R

我有一个字符串数组,由 4 个字母 J, K, Q, Z 的所有可能组合组成。数组中的条目最少由两个字母组成,最多由四个字母组成。例如:data<-c("QK", "KQ", "JKQZ", "KJZ")

我想计算数组中每个条目出现的次数,但不区分由相同字母但顺序不同的字符串。我知道 table(data) 不会这样做,因为它不认为 QKKQ 是一样的,而 returns

data
JKQZ  KJZ   KQ   QK 
   1    1    1    1 

我一直在查看 pmatchcharmatch,但这似乎无法满足我的要求。

编辑:我应该澄清一下,没有重复字母的条目。本质上,我不能输入 ZZKZK

这是 David comment/answer 的更长变体:

vals    <- sort(unique(unlist(strsplit(data,''))))
combos  <- unlist(sapply(seq_along(vals),function(i)combn(vals,i,paste0,collapse="")))
newdata <- factor(sapply(strsplit(data,""),function(x)paste0(sort(x),collapse="")),
             levels=combos)
tab <- table(newdata)
# newdata
#    J    K    Q    Z   JK   JQ   JZ   KQ   KZ   QZ  JKQ  JKZ  JQZ  KQZ JKQZ 
#    0    0    0    0    0    0    0    2    0    0    0    1    0    0    1 
tab[tab>0] # alternately
#   KQ  JKZ JKQZ 
#    2    1    1 

我会首先对每个观察进行 table(设置为获得零单元格的一个因素),然后对每个 table 进行散列并计算:

require(magrittr)
require(digest)
data<-c("QK", "KQ", "JKQZ", "KJZ")
tbl <- strsplit(data, "") %>% lapply(factor,levels=c("K","Q", "J", "Z")) %>%
lapply(table) %>%  do.call(what=rbind)
tbl

这给出了这个:

     K Q J Z
[1,] 1 1 0 0
[2,] 1 1 0 0
[3,] 1 1 1 1
[4,] 1 0 1 1

然后散列和计数:

h <- apply(tbl, 1, digest)
tbl <- cbind(tbl, count=as.vector(table(h)[h]))
tbl <- tbl[!duplicated(h), ]

结果如下:

     K Q J Z count
[1,] 1 1 0 0     2
[2,] 1 1 1 1     1
[3,] 1 0 1 1     1