Как вставить символ обратно в строку в том месте, где он был изначально - PullRequest
1 голос
/ 17 января 2020

У меня есть строки, у которых есть точки здесь и там, и я хотел бы удалить их - это сделано, и после некоторых других операций - это также сделано, я хотел бы вставить точки обратно на их первоначальное место - это не сделано. Как я мог это сделать?

library(stringr)
stringOriginal <- c("abc.def","ab.cd.ef","a.b.c.d")
dotIndex <- str_locate_all(pattern ='\\.', stringOriginal)
stringModified <- str_remove_all(stringOriginal, "\\.")

Я вижу, что str_sub() может помочь, например, str_sub(stringModified[2], 3,2) <- "." меня куда-то доставляет, но это все еще далеко от правильного места, и я также не знаю, как это сделать программно. Спасибо за ваше время!

обновление

stringOriginal <- c("11.123.100","11.123.200","1.123.1001") 
stringOriginalF <- as.factor(stringOriginal) 
dotIndex <- str_locate_all(pattern ='\\.', stringOriginal) 
stringModified <- str_remove_all(stringOriginal, "\\.") 
stringNumFac <- sort(as.numeric(stringModified)) 
stringi::stri_sub(stringNumFac[1:2], 3, 2) <- "." 
stringi::stri_sub(stringNumFac[1:2], 7, 6) <- "." 
stringi::stri_sub(stringNumFac[3], 2, 1) <- "." 
stringi::stri_sub(stringNumFac[3], 6, 5) <- "." 
factor(stringOriginal, levels = stringNumFac)

после таких манипуляций, я могу упорядочить числа и преобразовать их обратно в строки и использовать их позже для зарисовки. Но так как я не знал бы положение точки, я хотел сделать это программно. Другой подход к упорядочению факторов также приветствуется. Хотя мне все еще интересно, как программно вставить символ обратно в строку в том месте, где он был изначально.

1 Ответ

2 голосов
/ 17 января 2020

Это может быть один из случаев использования базовых R strsplit, который дает вам список с вектором подстрок для каждой записи в вашем исходном векторе. Вы можете манипулировать ими с помощью lapply или sapply очень легко.

split_string <- strsplit(stringOriginal, "[.]")
#> split_string
#> [[1]]
#> [1] "11"  "123" "100"
#> 
#> [[2]]
#> [1] "11"  "123" "200"
#> 
#> [[3]]
#> [1] "1"    "123"  "1001"

Теперь вы можете сделать это, чтобы получить числа

sapply(split_string, function(x) as.numeric(paste0(x, collapse = "")))
# [1] 11123100 11123200 11231001

И это, чтобы поставить точки (или любая замена точек) обратно:

sapply(split_string, paste, collapse = ".")
# [1] "11.123.100" "11.123.200" "1.123.1001"

И вы можете получить расположение точек в каждом элементе вашего исходного вектора, например:

lapply(split_string, function(x) cumsum(nchar(x) + 1))
# [[1]]
# [1]  3  7 11
# 
# [[2]]
# [1]  3  7 11
#
# [[3]]
# [1]  2  6 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...