需要找到最常见的字母组合

时间:2016-12-22 10:47:20

标签: r

简单来说,我有10行5个字符,每个字符可以是A-Z。

E.g //

KJGXI
GDGQT
JZKDC
YOTQD
SSDIQ
PLUWC
TORHC
PFJSQ
IIZMO
BRPOJ
WLMDX
AZDIJ
ARNUA
JEXGA
VFPIP
GXOXM
VIZEM
TFVQJ
OFNOG
QFNJR
ZGUBZ
CCTMB
HZPGV
ORQTJ

我想知道哪个3字母组合最常见。但是,组合不需要按顺序排列,也不需要彼此相邻。 E.g

ABCXY
CQDBA

=ABC 

我可能会用无尽的循环来强制它,但我想知道是否有更好的方法!

2 个答案:

答案 0 :(得分:2)

这是一个解决方案:

x <- c("KJGXI", "GDGQT", "JZKDC", "YOTQD", "SSDIQ", "PLUWC", "TORHC", "PFJSQ", "IIZMO", "BRPOJ", "WLMDX", "AZDIJ",
       "ARNUA", "JEXGA", "VFPIP", "GXOXM", "VIZEM", "TFVQJ", "OFNOG", "QFNJR", "ZGUBZ", "CCTMB", "HZPGV", "ORQTJ")

temp <- do.call(cbind, lapply(strsplit(x, ""), combn, m = 3))

temp <- apply(temp, 2, sort)
temp <- apply(temp, 2, paste0, collapse = "")

sort(table(temp), decreasing = TRUE)

将返回每个组合出现的次数。然后,您可以使用names(which.max(sort(table(temp), decreasing = TRUE)))来组合(在本例中为"FJQ"

在这种情况下,两个组合出现3次,你可以做到

result <- sort(table(temp), decreasing = TRUE)
names(which(result == max(result)))
# [1] "FJQ" "IMZ"

让这两种组合出现的次数最多。

代码的工作原理如下:

  • x的每个元素分成五个字母,然后从5个字母中生成3个元素的每个可能组合
  • 按字母顺序对每个组合进行排序
  • 将3个字母粘贴在一起
  • 为每个组合生成计数,并对结果进行排序

答案 1 :(得分:1)

我会将每个字符串拆分成字母,对它们进行排序,然后使用combn来获取所有组合。使用paste0将这些内容折叠回字符串并计算。

txt <- c("KJGXI", "GDGQT", "JZKDC", "YOTQD", "SSDIQ", "PLUWC", "TORHC", 
     "PFJSQ", "IIZMO", "BRPOJ", "WLMDX", "AZDIJ", "ARNUA", "JEXGA", 
     "VFPIP", "GXOXM", "VIZEM", "TFVQJ", "OFNOG", "QFNJR", "ZGUBZ", 
     "CCTMB", "HZPGV", "ORQTJ")
txt2 <- strsplit(txt, split = "")

txt2 <- lapply(txt2, sort)
txt3 <- lapply(txt2, combn, m = 3)

txt4 <- lapply(txt3, function(x){apply(x, 2, paste0, collapse = "")})
table(unlist(txt4))

这里可以合并几个步骤。