简单来说,我有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
我可能会用无尽的循环来强制它,但我想知道是否有更好的方法!
答案 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个元素的每个可能组合答案 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))
这里可以合并几个步骤。