R中字符的匹配和计数

时间:2015-05-27 20:37:54

标签: r string character

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

我想计算数组中每个条目出现的次数,但不区分由相同字母组成但顺序不同的字符串。我知道table(data)没有做到这一点,因为它没有将QKKQ视为相同并返回

data
JKQZ  KJZ   KQ   QK 
   1    1    1    1 

我一直在关注pmatchcharmatch,但这似乎并不是我想要的。

编辑:我应该澄清,没有一个条目可以重复一封信。从本质上讲,我不能有条目ZZKZK

2 个答案:

答案 0 :(得分:2)

这是David的评论/回答的更长变化:

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 

答案 1 :(得分:1)

我首先会根据观察结果创建一个表(设置为获取零单元格的因子),然后对每个表进行哈希并计算:

@receiver(user_signed_up)
def after_user_signed_up(sender, request, user):
    send_email_confirmation(request, user, signup=signup)

给出了这个:

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), ]