【问题标题】:Matching and Counting Strings of Characters in RR中字符的匹配和计数字符串
【发布时间】:2015-08-10 03:25:27
【问题描述】:

我有一个由 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

【问题讨论】:

  • 这是一个 awkword 可能的解决方案table(sapply(strsplit(data, ""), function(x) paste(sort(x), collapse = "")))
  • 所以,基本上,它会按字母顺序重写每个条目,然后使用 table(),对吗?
  • 是的,类似的...
  • “QQQ”是放在自己的桶里,还是和“Q”聚合?
  • 我应该澄清一下,不允许在同一个条目中重复字母。

标签: r string character


【解决方案1】:

这是大卫评论/答案的更长变体:

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 

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多