我有这个字符串:
seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"
Run Code Online (Sandbox Code Playgroud)
给定另一个字符串
bb_seq <- "rhhhhitv"
Run Code Online (Sandbox Code Playgroud)
我想做的是通过保持结果的顺序来替换?为字符:bb_seqbb_seq
的总长度?保证与 相同bb_seq。
KrEDhhHRDDKDKDhHEhREKEitDEvKKK
Run Code Online (Sandbox Code Playgroud)
我怎样才能用 R 实现这一目标?
我尝试过这个但失败了:
seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"
bb_seq <- "rhhhhitv"
sp <- seed_pattern
gr <- gregexpr("\\?+", sp)
csml <- lapply(gr, function(sp) cumsum(attr(sp, "match.length")))
regmatches(sp, gr) <- lapply(csml, function(sp) substring(bb_seq, c(1, sp[1]), sp))
sp
# KrEDrhhHRDDKDKDrhhhHErhhhhREKErhhhhitDErhhhhitvKKK
Run Code Online (Sandbox Code Playgroud)
我对非正则表达式解决方案持开放态度。
H 1*_*H 1 10
您可以通过对您之前问题中收到的解决方案稍加更改来完成此操作(感谢@thelatemail):
regmatches(seed_pattern, gregexpr("\\?", seed_pattern)) <- strsplit(bb_seq, "")
Run Code Online (Sandbox Code Playgroud)
检查它是否提供了预期的结果:
seed_pattern == "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
拆分、替换、合并:
> target <- strsplit(seed_pattern, "")[[1]]
> replacement <- strsplit(bb_seq, "")[[1]]
> target[target=="?"] <- replacement
> paste(target, collapse = "")
[1] "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
Run Code Online (Sandbox Code Playgroud)