Предположим, в R у меня есть строковый вектор, состоящий из слов:
string1<-c("1ST COMPANY", "21ST LIBRARY")
Однако внутри этих строк я хочу преобразовать слова с порядковыми номерами, такие как «1ST», в «Первый», а «21ST» в «Двадцать первый». Есть ли способ преобразовать эти порядковые числовые строки в такие слова, как «Первый»? Мой идеальный результат был бы:
string2<-c("FIRST COMPANY", "TWENTY-FIRST LIBRARY")





Вот не очень красивый хак:
# create ordinals look up
ordinals <- c("1" = "FIRST","21" = "TWENTY-FIRST")
# split string1
split_string1 <- c(unlist(strsplit(string1,split = " ")))
# convert ordinals in split_string1 into numbers
my_nums <- c()
for(i in split_string1){
my_nums <- c(my_nums,sub("(\\d+)(ST|ND|RD|TH)","\\1",i))
}
# using the index positions of the target ordinals,
# replace them with their word equivalent from look up
split_string1[c(1,3)] <- ordinals[my_nums[c(1,3)]]
# concatenate
split_string1 <- paste(split_string1,collapse = " ")
print(split_string1)
"FIRST COMPANY TWENTY-FIRST LIBRARY"
Надеюсь, поможет!
Извлеките такие слова, как "1ST", "21ST", а затем извлеките их числовые значения. Функция english::ordinal() преобразует эти числовые значения в их представление, например first, twenty-first.
library(stringr)
library(english)
library(readr)
str_replace_all(string1, "\\b\\d+(ST|ND|RD|TH)\\b", ~ ordinal(parse_number(.))) |>
str_to_upper()
# [1] "FIRST COMPANY" "TWENTY-FIRST LIBRARY"
textclean::replace_ordinalможет приблизить вас.stringr::str_to_upper(textclean::replace_ordinal(stringr::str_to_lower(string1)))