подстрока заменяет n-ю позицию R - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно заменить 6,7,8-ю позицию на «_». В подстроке я упомянул начальную и конечную позиции. Это не сработало.

> a=c("UHI786KJRH2V", "TYR324FHASJKDG","DHA927NFSYFN34")
> substring(a, 6,8) <- "_"
> a
[1] "UHI78_KJRH2V"   "TYR32_FHASJKDG" "DHA92_NFSYFN34"

мне нужно UHI78_RH2V TYR32_ASJKDG DHA92_SYFN34

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Из документации:

Если часть, подлежащая замене, длиннее строки замены, то заменяется только часть длины строки.

Итак, мы могли бы сделать что-то вроде этого:

substring(a, 6,8) <- "_@@"
sub("@+", "", a)
[1] "UHI78_RH2V"   "TYR32_ASJKDG" "DHA92_SYFN34"
0 голосов
/ 29 августа 2018

1) str_sub <- </strong> Функция замены str_sub<- в пакете stringr может сделать это.

library(stringr)

str_sub(a, 6, 8) <- "_"
a
## [1] "UHI78_RH2V"   "TYR32_ASJKDG" "DHA92_SYFN34"

2 База R Только с базой R вы можете сделать это. Он заменяет всю строку соответствием первой группе захвата, подчеркиванием и соответствием второй группе захвата.

sub("(.....)...(.*)", "\\1_\\2", a)
## [1] "UHI78_RH2V"   "TYR32_ASJKDG" "DHA92_SYFN34"

Это регулярное выражение также можно записать как "(.{5}).{3}(.*)".

3) разделить / объединить Если a является столбцом во фрейме данных, тогда мы могли бы использовать dplyr и tidyr для этого:

library(dplyr)
library(tidyr)
DF <- data.frame(a)

DF %>% 
  separate(a, into = c("pre", "junk", "post"), sep = c(5, 8)) %>%
  select(-junk) %>% 
  unite(a)

дает:

             a
1   UHI78_RH2V
2 TYR32_ASJKDG
3 DHA92_SYFN34
0 голосов
/ 29 августа 2018

Используя sub, мы можем сопоставить шаблон (?<=^.{5}).{3}, а затем заменить его одним подчеркиванием:

a <- c("UHI786KJRH2V", "TYR324FHASJKDG","DHA927NFSYFN34")
out <- sub("(?<=^.{5}).{3}", "_", a, perl=TRUE)
out
[1] "UHI78_RH2V"   "TYR32_ASJKDG" "DHA92_SYFN34"

Демо

Мы могли бы также попытаться выполнить операции с подстрокой здесь, но мы должны были бы сделать некоторое соединение:

out <- paste0(substr(a, 1, 5), "_", substr(a, 9, nchar(a)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...