将书面数字转换为R中的数字

亨克

是否有人知道将数字的文本表示形式转换为实际数字的功能,例如将“二十三百零五”转换为实际数字20305。我在数据帧行中写入了数字,并希望将其转换为数字。

在软件包qdap中,您可以用单词替换数字表示的数字(例如1001变为1000),但反之则不行:

library(qdap)
replace_number("I like 346457 ice cream cones.")
[1] "I like three hundred forty six thousand four hundred fifty seven ice cream cones."
汤玛士

这是一个应该使您成千上万的起点。

word2num <- function(word){
    wsplit <- strsplit(tolower(word)," ")[[1]]
    one_digits <- list(zero=0, one=1, two=2, three=3, four=4, five=5,
                       six=6, seven=7, eight=8, nine=9)
    teens <- list(eleven=11, twelve=12, thirteen=13, fourteen=14, fifteen=15,
                  sixteen=16, seventeen=17, eighteen=18, nineteen=19)
    ten_digits <- list(ten=10, twenty=20, thirty=30, forty=40, fifty=50,
                       sixty=60, seventy=70, eighty=80, ninety=90)
    doubles <- c(teens,ten_digits)
    out <- 0
    i <- 1
    while(i <= length(wsplit)){
        j <- 1
        if(i==1 && wsplit[i]=="hundred")
            temp <- 100
        else if(i==1 && wsplit[i]=="thousand")
            temp <- 1000
        else if(wsplit[i] %in% names(one_digits))
            temp <- as.numeric(one_digits[wsplit[i]])
        else if(wsplit[i] %in% names(teens))
            temp <- as.numeric(teens[wsplit[i]])
        else if(wsplit[i] %in% names(ten_digits))
            temp <- (as.numeric(ten_digits[wsplit[i]]))
        if(i < length(wsplit) && wsplit[i+1]=="hundred"){
            if(i>1 && wsplit[i-1] %in% c("hundred","thousand"))
                out <- out + 100*temp
            else
                out <- 100*(out + temp)
            j <- 2
        }
        else if(i < length(wsplit) && wsplit[i+1]=="thousand"){
            if(i>1 && wsplit[i-1] %in% c("hundred","thousand"))
                out <- out + 1000*temp
            else
                out <- 1000*(out + temp)
            j <- 2
        }
        else if(i < length(wsplit) && wsplit[i+1] %in% names(doubles)){
            temp <- temp*100
            out <- out + temp
        }
        else{
            out <- out + temp
        }
        i <- i + j
    }
    return(list(word,out))
}

结果:

> word2num("fifty seven")
[[1]]
[1] "fifty seven"

[[2]]
[1] 57

> word2num("four fifty seven")
[[1]]
[1] "four fifty seven"

[[2]]
[1] 457

> word2num("six thousand four fifty seven")
[[1]]
[1] "six thousand four fifty seven"

[[2]]
[1] 6457

> word2num("forty six thousand four fifty seven")
[[1]]
[1] "forty six thousand four fifty seven"

[[2]]
[1] 46457

> word2num("forty six thousand four hundred fifty seven")
[[1]]
[1] "forty six thousand four hundred fifty seven"

[[2]]
[1] 46457

> word2num("three forty six thousand four hundred fifty seven")
[[1]]
[1] "three forty six thousand four hundred fifty seven"

[[2]]
[1] 346457

我已经可以告诉您这word2num("four hundred thousand fifty")对它是行不通的,因为它不知道如何处理连续的“百”和“千”项,但是算法可能可以修改。如果有改进或以自己的答案为基础,则任何人都应随时编辑此内容。我只是觉得这是一个有趣的问题(一段时间)。

编辑:显然,比尔·维纳布尔斯(Bill Venables)有一个名为english的软件包,它可能比上面的代码更好地实现此目的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数字转换为R中的日期

来自分类Dev

将罗马数字转换为R中的数字

来自分类Dev

将粘贴的数字转换为r中的数字向量

来自分类Dev

将罗马数字转换为R中的数字

来自分类Dev

你如何将 UTF8 数字转换为书面文本

来自分类Dev

将数字字段转换为R中的时间格式

来自分类Dev

将时间从数字转换为R中的时间格式

来自分类Dev

将字符转换为数字,而r中不包含NA

来自分类Dev

使用R中的标签将数字转换为因数

来自分类Dev

将字符列转换为R中的数字

来自分类Dev

无法将字符转换为R中的数字

来自分类Dev

将数字的向量转换为R中的连续整数

来自分类Dev

将数字序列转换为R中的日期

来自分类Dev

将每月数字转换为 R 中的可读日期

来自分类Dev

R将数字转换为日期的问题

来自分类Dev

将数字转换为Javascript中的数组

来自分类Dev

将数字转换为数组中的单词

来自分类Dev

将数字转换为Angular中的单词

来自分类Dev

将列中的字母转换为数字

来自分类Dev

将数字字符串转换为R中的数字数据类型

来自分类Dev

如何在保留R中的数字的同时将因子变量转换为数字

来自分类Dev

如何将R中包含多个点的数字从字符转换为数字?

来自分类Dev

如何将字母数字字符串转换为 R 中的数字?

来自分类Dev

SAS将字符/数字转换为数字

来自分类Dev

将数字转换为罗马数字

来自分类Dev

将Unicode数字转换为普通数字

来自分类Dev

将数字转换为罗马数字

来自分类Dev

将数字转换为数字数组

来自分类Dev

将字母转换为数字