Как выровнять набор строк на символе с заданным количеством символов на каждой стороне (заменить отсутствующие символы на «x»)? - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть набор строк, каждая из которых имеет один символ "X"

c("KGDDQSXQGGAPDAGQE", "TEEDSEEVXEQK", "LTXTSGETTQTHTEPTGDSK", "IXTHNSEVEEDDMDK", "SXENPEEDEDQRNPAK", "XTAEHEAAQQDLQSK", "ATVIXHGETLRRTK", "XAVAREESGKPGAHVTVK", "YHTINGHNAEVXK", "XAAEDDEDDDVDTK")

Я хотел бы получить вектор символов с каждым элементом, имеющим 11 символов, центр строки - "X" "и есть 5 символов из строки на каждой стороне. Если на одной из сторон нет 5 символов, вместо этого добавляется «x».

Например
«KGDDQSXQGGAPDAGQE», становится «GDDQSXQGGAP»

«TEEDSEEVXEQK», становится « DSEEVXEQKxx "

" LTXTSGETTQTHTEPTGDSK ", становится" xxxLTXTSGET "

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Еще один подход с использованием stringr:

library(stringr)

vec <- c("KGDDQSXQGGAPDAGQE", "TEEDSEEVXEQK", "LTXTSGETTQTHTEPTGDSK", "IXTHNSEVEEDDMDK", "SXENPEEDEDQRNPAK", "XTAEHEAAQQDLQSK", "ATVIXHGETLRRTK", "XAVAREESGKPGAHVTVK", "YHTINGHNAEVXK", "XAAEDDEDDDVDTK")

vec %>%
  str_pad(width = sapply(vec, nchar) + 10, 
          side = "both", pad = "x") %>%
  str_match(".{5}X.{5}")
#>       [,1]         
#>  [1,] "GDDQSXQGGAP"
#>  [2,] "DSEEVXEQKxx"
#>  [3,] "xxxLTXTSGET"
#>  [4,] "xxxxIXTHNSE"
#>  [5,] "xxxxSXENPEE"
#>  [6,] "xxxxxXTAEHE"
#>  [7,] "xATVIXHGETL"
#>  [8,] "xxxxxXAVARE"
#>  [9,] "HNAEVXKxxxx"
#> [10,] "xxxxxXAAEDD"

Создан в 2020-04-26 пакетом Представить (v0.3.0)

0 голосов
/ 27 апреля 2020

Вот вариант

charcenter <- function(input, char="X", pad=5) {
  index <- regexpr("X", input, fixed=TRUE)
  extr <- substr(input, pmax(0, index-pad), pmin(index+pad, nchar(input)))
  padl <- strrep("x", pmax(pad-index+1, 0))
  padr <- strrep("x", pmax(pad-nchar(input)+index, 0))
  paste0(padl, extr, padr)
}

мы используем регулярное выражение, чтобы найти первый X, затем используем substr(), чтобы извлечь как можно больше вокруг него, а затем выяснить, сколько заполнения требуется и каждую сторону и добавить это в.

Если я объединю его с вводом, вот результат

input <- c("KGDDQSXQGGAPDAGQE", "TEEDSEEVXEQK", "LTXTSGETTQTHTEPTGDSK", "IXTHNSEVEEDDMDK", "SXENPEEDEDQRNPAK", "XTAEHEAAQQDLQSK", "ATVIXHGETLRRTK", "XAVAREESGKPGAHVTVK", "YHTINGHNAEVXK", "XAAEDDEDDDVDTK")
cbind(charcenter(input), input)
#                     input                 
#  [1,] "GDDQSXQGGAP" "KGDDQSXQGGAPDAGQE"   
#  [2,] "DSEEVXEQKxx" "TEEDSEEVXEQK"        
#  [3,] "xxxLTXTSGET" "LTXTSGETTQTHTEPTGDSK"
#  [4,] "xxxxIXTHNSE" "IXTHNSEVEEDDMDK"     
#  [5,] "xxxxSXENPEE" "SXENPEEDEDQRNPAK"    
#  [6,] "xxxxxXTAEHE" "XTAEHEAAQQDLQSK"     
#  [7,] "xATVIXHGETL" "ATVIXHGETLRRTK"      
#  [8,] "xxxxxXAVARE" "XAVAREESGKPGAHVTVK"  
#  [9,] "HNAEVXKxxxx" "YHTINGHNAEVXK"       
# [10,] "xxxxxXAAEDD" "XAAEDDEDDDVDTK" 
0 голосов
/ 27 апреля 2020

Предполагается, что символ должен содержать "X".

  1. strsplit с X. Теперь есть две отдельные строки. Назовите их Left, Right
  2. Если длина Left короче 5, добавьте x. То же самое для Right
  3. Иначе, если Left имеет длину больше 5, выберите только 5 символов. То же самое для Right
  4. paste им.
vec <- c("KGDDQSXQGGAPDAGQE", "TEEDSEEVXEQK", 
"LTXTSGETTQTHTEPTGDSK", "IXTHNSEVEEDDMDK", 
"SXENPEEDEDQRNPAK", "XTAEHEAAQQDLQSK", 
"ATVIXHGETLRRTK", "XAVAREESGKPGAHVTVK", 
"YHTINGHNAEVXK", "XAAEDDEDDDVDTK")

myf <- function(v){

  v <- unlist(strsplit(v,'X'))
  Left <- v[1]
  Right <- v[2]

  if(nchar(Left)>5){
    Left <- substr(Left, nchar(Left)-4 ,nchar(Left))
  }
  else{
    Left <- paste0(paste0(rep('x', 5-nchar(Left)),collapse = ''), Left, collapse = '')
  }

  if(nchar(Right)>5){
    Right <- substr(Right, 1, 5)
  }
  else{
    Right <- paste0(Right, paste0(rep('x', 5-nchar(Right)), collapse = '') , collapse = '')
  }

  paste0(Left,'X',Right,collapse = '')
}


sapply(vec, myf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...