我有這個字串:
seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"
給定另一個字串
bb_seq <- "rhhhhitv"
我想做的是通過保持結果的順序替換?為一個字符:bb_seqbb_seq
的總長度?保證與 相同bb_seq。
KrEDhhHRDDKDKDhHEhREKEitDEvKKK
我怎樣才能用 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
我對非正則運算式解決方案持開放態度。
uj5u.com熱心網友回復:
拆分、替換、合并:
> target <- strsplit(seed_pattern, "")[[1]]
> replacement <- strsplit(bb_seq, "")[[1]]
> target[target=="?"] <- replacement
> paste(target, collapse = "")
[1] "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
uj5u.com熱心網友回復:
您可以通過一次更換一個來做到這一點(可能不是很有效)?:
seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"
bb_seq <- "rhhhhitv"
for (ch in unlist(strsplit(bb_seq, ""))) {
print(ch)
seed_pattern <- sub("?", ch, seed_pattern, fixed = TRUE)
}
print(seed_pattern)
# [1] "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
可悲sub的是沒有矢量化replacement論點!
uj5u.com熱心網友回復:
這里有很長的路要走。如果不考慮 tibbles 或資料框,我仍然無法做這些事情。希望有一天我會明白這一點:
library(dplyr)
library(tidyr)
tibble(seed_pattern, bb_seq) %>%
separate_rows(seed_pattern, sep='\\?') %>%
mutate(seed_pattern = paste(paste0(seed_pattern, substr(bb_seq, row_number(), row_number())), collapse = "")) %>%
slice(1) %>%
pull(seed_pattern)
[1] "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
uj5u.com熱心網友回復:
您可以在一行中完成此操作,只需對您從之前的問題中收到的解決方案稍作更改(感謝@thelatemail):
regmatches(seed_pattern, gregexpr("\\?", seed_pattern)) <- strsplit(bb_seq, "")
檢查它提供了預期的結果:
seed_pattern == "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
[1] TRUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535553.html
標籤:r正则表达式细绳
