qdap包:将零位数转换为“零”字的错误

时间:2016-08-01 23:05:08

标签: r numbers text-processing qdap

之前(作为新手)我将其作为R包错误提交,让我一起运行它。我认为以下所有方面都很好:

replace_number("123 0 boogie")
[1] "one hundred twenty three boogie"
replace_number("1;1 foo")
[1] "one;one foo"
replace_number("47 bar")
[1] "forty seven bar"
replace_number("0")
"zero"

我认为以下所有情况都很糟糕,因为输出中缺少“零”:

replace_number("1;0 foo")
[1] "one; foo"
replace_number("00 bar")
[1] "bar"
replace_number("0x")
[1] "x"

基本上,我会说replace_number()无法处理包含数字0的字符串(“0”除外)。这是一个真正的错误吗?

1 个答案:

答案 0 :(得分:5)

如果你深入研究replace_number

的内心
 unlist(lapply(lapply(gsub(",([0-9])", "\\1", text.var), function(x) {
        if (!is.na(x) & length(unlist(strsplit(x, "([0-9])", 
            perl = TRUE))) > 1) {
            num_sub(x, num.paste = num.paste)
        }
        else {
            x
        }
    }), function(x) mgsub(0:9, ones, x)))

您可以在qdap:::num_sub

中看到问题
qdap:::num_sub("101", num.paste = "combine") ## "onehundredone"
qdap:::num_sub("0", num.paste = "combine")   ## ""

在该功能中挖掘,问题出现在numb2word,其中包含内部代码

ones <- c("", "one", "two", "three", "four", "five", "six", 
    "seven", "eight", "nine")
names(ones) <- 0:9

将零值转换为空白。如果我自己面临这个问题,我会分叉qdap repo,转到replace_number.R,然后尝试以向后兼容的方式更改此问题,以便replace_number可以采用逻辑论证blank_zeros=TRUE,传递给numb2word并做正确的事,例如

ones <- c(if (blank_zeros) "" else "zero",
          "one", "two", "three", "four", "five", "six", 
    "seven", "eight", "nine")

与此同时,我已在qdap issues list上发布此内容。