我有以下順序:
my_seq <- "----?????-----?V?D????-------???IL??A?---"
我想要做的是檢測非虛線字符的位置范圍。
----?????-----?V?D????-------???IL??A?---
| | | | | | |
1 5 9 15 22 30 38
最終輸出將是一個字串向量:
out <- c("5-9", "15-22", "30-38")
我怎樣才能用 R 實作這一點?
uj5u.com熱心網友回復:
請在下面找到使用該stringr庫的另一種可能的解決方案
代表
- 代碼
library(stringr)
s <- as.data.frame(str_locate_all(my_seq, "[^-] ")[[1]])
result <- paste(s$start, s$end, sep ="-")
- 輸出
result
#> [1] "5-9" "15-22" "30-38"
由reprex 包于 2022-02-18 創建(v2.0.1)
uj5u.com熱心網友回復:
這是一個 rle tidyverse 方法:
library(dplyr)
with(rle(strsplit(my_seq, "")[[1]] != "-"),
data.frame(lengths, values)) |>
mutate(end = cumsum(lengths)) |>
mutate(start = 1 lag(end, 1,0)) |>
mutate(rng = paste(start, end, sep = "-")) |>
filter(values) |>
pull(rng)
[1] "5-9" "15-22" "30-38"
但是,如果您不介意安裝S4Vectors代碼,可以非常簡潔:
library(S4Vectors)
r <- Rle(strsplit(my_seq, "")[[1]] != "-")
paste(start(r), end(r), sep = "-")[runValue(r)]
[1] "5-9" "15-22" "30-38"
uj5u.com熱心網友回復:
你可以這樣做:
my_seq <- "----?????-----?V?D????-------???IL??A?---"
non_dash <- which(strsplit(my_seq, "")[[1]] != '-')
pos <- non_dash[c(0, diff(non_dash)) != 1 | c(diff(non_dash), 0) != 1]
apply(matrix(pos, ncol = 2, byrow = TRUE), 1, function(x) paste(x, collapse = "-"))
#> [1] "5-9" "15-22" "30-38"
由reprex 包于 2022-02-18 創建(v2.0.1)
uj5u.com熱心網友回復:
您可以使用grepexpr來獲取除了破折號之外的所有字符的位置:
unlist(gregexpr(pattern = "[^-]", my_seq))
# [1] 5 6 7 8 9 15 16 17 18 19 20 21 22 30 31 32 33 34 35 36 37 38
為了獲得基于該向量的范圍,SO 中已經有多種可能性,例如這里。
findIntRuns <- function(run){
rundiff <- c(1, diff(run))
difflist <- split(run, cumsum(rundiff!=1))
unlist(lapply(difflist, function(x){
if(length(x) %in% 1:2) as.character(x) else paste0(x[1], "-", x[length(x)])
}), use.names=FALSE)
}
g <- unlist(gregexpr(pattern = "[^-]", my_seq))
findIntRuns(g)
# [1] "5-9" "15-22" "30-38"
uj5u.com熱心網友回復:
嘗試
paste0(gregexec('-\\?', my_seq)[[1]][1,] 1, '-',
gregexec('\\?-', my_seq)[[1]][1,])
#> [1] "5-9" "15-22" "30-38"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427075.html
