Как преобразовать все латинские числа (например, «xxv», «xxxv», «iii» и «ii») в числовые значения в текстовых данных с помощью R?
Мне нужно преобразовать все латинские числа в текстовых данных в числовые значения. Есть ли какая-нибудь функция в R, которая может преобразовать все латинские числа сразу?
Кроме того, когда я заменяю по одной, что, если у меня в некоторых словах есть такие буквы, как «ii», «i»? Например, изменится ли мир «все еще» на «st1ll»?





txt <- 'How to convert all the Latin numbers (such as "xxv," "xxxv," "iii," and "ii") into numerical values in text data with R?
I need to convert all the Latin numbers in a text data into numerical values. Is there any function in R can convert all the Latin numbers at once?
In addition, when I replace one by one, what if I have some words contains letters like "ii", "i"? For example, would the world "still" be changed into "st1ll"?'
Получите вектор латинских символов (обратите внимание, если вы сделаете это слишком большим, gregexpr выдаст ошибку, однако я не проверял, каков предел - он где-то между 1e2 и 1e3)
Исключите «I», так как это, скорее всего, не будет цифрой, затем создайте свой шаблон и обработайте его как любую другую строку поиска/замены:
rom <- as.character(as.roman(1:1e2))
rom <- setdiff(rom, 'I')
p <- sprintf('\\b(%s)\\b', paste0(na.omit(rom), collapse = '|'))
m <- gregexpr(p, txt, ignore.case = TRUE)
regmatches(txt, m) <- lapply(regmatches(txt, m), function(x) as.numeric(as.roman(x)))
cat(txt)
# How to convert all the Latin numbers (such as "25," "35," "3," and "2") into numerical values in text data with R?
#
# I need to convert all the Latin numbers in a text data into numerical values. Is there any function in R can convert all the Latin numbers at once?
#
# In addition, when I replace one by one, what if I have some words contains letters like "2", "i"? For example, would the world "still" be changed into "st1ll"?
Как функция:
dd <- data.frame(
texts = rep(txt, 5)
)
rom_to_num <- function(text, rom = 1:1e2, exclude = 'I') {
rom <- as.character(as.roman(rom))
rom <- setdiff(rom, exclude)
p <- sprintf('\\b(%s)\\b', paste0(na.omit(rom), collapse = '|'))
m <- gregexpr(p, text, ignore.case = TRUE)
regmatches(text, m) <- lapply(regmatches(text, m), function(x) as.numeric(as.roman(x)))
text
}
dd <- within(dd, {
texts_new <- rom_to_num(texts)
})
Можно ли преобразовать только независимое латинское число (я имею в виду с пробелом впереди и после)? Я не хочу, чтобы "ii" и "iv" пропадали другими словами в тексте.
Смотрите ответ на свой другой вопрос здесь: stackoverflow.com/questions/74399312/…
@Emily Эмили, они даже не меняются в вашем примере
Спасибо, вы правы. Ответ принят! У меня есть еще один дополнительный вопрос: моя структура данных представляет собой фрейм данных, и у меня есть текст в качестве переменной для более чем 1000 наблюдений. Я следовал вашему коду, и он хорошо работал для преобразования чисел. Но текст из каждого наблюдения сходится в единое целое и не соответствует наблюдению по отдельности. Как я могу решить эту проблему? Я новичок в R, и заранее спасибо :)
@Emily, вам просто нужно применить код как цикл или создать функцию, см. правки
Я не думаю, что это дубликат. ОП хочет заменить латинские цифры в тексте.