在R中匹配和计数字符的字符串

4

我有一个字符串数组,由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


3
这是一个可能有些别扭的解决方案:table(sapply(strsplit(data, ""), function(x) paste(sort(x), collapse = "")))。其意思是对数据进行分割,然后对每个子串进行排序并合并成一个字符串,最后计算每个不同字符串出现的次数。 - David Arenburg
所以,基本上它会按字母顺序重写每个条目,然后使用 table() 函数,对吗? - g_puffo
是的,就是那样... - David Arenburg
“QQQ”会被放在自己的桶里,还是与“Q”聚合在一起? - Neal Fultz
我应该澄清的是,同一条目中不允许重复字母。 - g_puffo
2个回答

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
我会先为每个观察值创建一个表格(设置为因子以获取零单元格),然后对每个表格进行哈希处理并计数:
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), ]

Here's the result:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接