在 R 中匹配和计算字符串
Matching and Counting Strings of Characters in R
我有一个字符串数组,由 4 个字母 J, K, Q, Z
的所有可能组合组成。数组中的条目最少由两个字母组成,最多由四个字母组成。例如:data<-c("QK", "KQ", "JKQZ", "KJZ")
。
我想计算数组中每个条目出现的次数,但不区分由相同字母但顺序不同的字符串。我知道 table(data)
不会这样做,因为它不认为 QK
和 KQ
是一样的,而 returns
data
JKQZ KJZ KQ QK
1 1 1 1
我一直在查看 pmatch
或 charmatch
,但这似乎无法满足我的要求。
编辑:我应该澄清一下,没有重复字母的条目。本质上,我不能输入 ZZ
或 KZK
这是 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
我有一个字符串数组,由 4 个字母 J, K, Q, Z
的所有可能组合组成。数组中的条目最少由两个字母组成,最多由四个字母组成。例如:data<-c("QK", "KQ", "JKQZ", "KJZ")
。
我想计算数组中每个条目出现的次数,但不区分由相同字母但顺序不同的字符串。我知道 table(data)
不会这样做,因为它不认为 QK
和 KQ
是一样的,而 returns
data
JKQZ KJZ KQ QK
1 1 1 1
我一直在查看 pmatch
或 charmatch
,但这似乎无法满足我的要求。
编辑:我应该澄清一下,没有重复字母的条目。本质上,我不能输入 ZZ
或 KZK
这是 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