请耐心等待,我来自 Python 背景,我仍在学习 R 中的字符串操作。
好吧,假设我有一个长度为 100 的字符串,其中包含随机的 A、B、C 或 D 字母:
> df<-c("ABCBDBDBCBABABDBCBCBDBDBCBDBACDBCCADCDBCDACDDCDACBCDACABACDACABBBCCCBDBDDCACDDACADDDDACCADACBCBDCACD")
> df
[1]"ABCBDBDBCBABABDBCBCBDBDBCBDBACDBCCADCDBCDACDDCDACBCDACABACDACABBBCCCBDBDDCACDDACADDDDACCADACBCBDCACD"
我想做以下两件事:
1) 生成一个“.txt”文件,该文件由上述字符串的 20 个长度的子部分组成,每个子部分在前一个字母之后开始,在其上方的行中有自己唯一的名称,如下所示:
NAME1
ABCBDBDBCBABABDBCBCB
NAME2
BCBDBDBCBABABDBCBCBD
NAME3
CBDBDBCBABABDBCBCBDB
NAME4
BDBDBCBABABDBCBCBDBD
...等等
2) 获取生成的列表并从中包含另一个列表,该列表具有完全相同的子字符串,唯一的区别是将 A、B、C 或 D 中的一个或两个更改为另一个 A、B、C,或 D(仅这四个字母中的任何一个)。
所以,这个:
NAME1
ABCBDBDBCBABABDBCBCB
会变成这样:
NAME1.1
ABBBDBDBCBDBABDBCBCB
如您所见,第 3 个位置的“C”变成了“B”,第 11 个位置的“A”变成了“D”,这些更改后的字母之间没有暗示关系。纯随机。
我知道这是一个令人费解的问题,但正如我所说,我仍在学习 R 中的基本文本和字符串操作。
提前致谢。
最佳答案
创建子字符串的文本文件
n <- 20 # length of substrings starts <- seq(nchar(df) - 20 + 1) v1 <- mapply(substr, starts, starts + n - 1, MoreArgs = list(x = df)) names(v1) <- paste0("NAME", seq_along(v1), "\n") write.table(v1, file = "filename.txt", quote = FALSE, sep = "", col.names = FALSE)
随机替换一个或两个字母(A-D):
myfun <- function() { idx <- sample(seq(n), sample(1:2, 1)) rep <- sample(LETTERS[1:4], length(idx), replace = TRUE) return(list(idx = idx, rep = rep)) } new <- replicate(length(v1), myfun(), simplify = FALSE) v2 <- mapply(function(x, y, z) paste(replace(x, y, z), collapse = ""), strsplit(v1, ""), lapply(new, "[[", "idx"), lapply(new, "[[", "rep")) names(v2) <- paste0(names(v2), ".1") write.table(v2, file = "filename2.txt", quote = FALSE, sep = "\n", col.names = FALSE)
关于string - 在 R 中生成子字符串和随机字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21737971/