我有一系列字符串,由4个字母J, K, Q, Z
的所有可能组合组成。数组中的条目至少由两个字母组成,最多为4个。例如:data<-c("QK", "KQ", "JKQZ", "KJZ")
。
我想计算数组中每个条目出现的次数,但不区分由相同字母组成但顺序不同的字符串。我知道table(data)
没有做到这一点,因为它没有将QK
和KQ
视为相同并返回
data
JKQZ KJZ KQ QK
1 1 1 1
我一直在关注pmatch
或charmatch
,但这似乎并不是我想要的。
编辑:我应该澄清,没有一个条目可以重复一封信。从本质上讲,我不能有条目ZZ
或KZK
答案 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), ]