我正在尝试编写一个将中文数字转换为阿拉伯语的函数。这个想法是获得一组scaled_digit
向量和一组scale_factor
向量,将它们相乘并相加以生成所需的输出。
digit=c('〇'=0,'一'=1,'二'=2,'三'=3,'四'=4,'五'=5,'六'=6,'七'=7,'八'=8,'九'=9)
scale=c('十'=10^1,'百'=10^2,'千'=10^3,'萬'=10^4,'億'=10^8,'兆'=10^12)
我遇到的问题之一是:
当我有一个几百10^4
秒(万)和几千10^12
秒(兆)的数字时,剩下的比例因子向量如下:
scale_factor=
structure(c(1000, 1e+12, 100, 10, 10000, 1000, 100, 10), .Names = c("千",
"兆", "百", "十", "萬", "千", "百", "十"))
[千] 兆 [百] [十] 萬 千 百 十
[1e+03] 1e+12 [1e+02] [1e+01] 1e+04 1e+03 1e+02 1e+01
要调整的比例因子已用[]标记。
基数的位置scale_factors
可以通过以下代码找到:
cardinal_scale_factor=which(diff(scale_factor)>=0, T)+1
兆 萬
2 5
我该如何编码,以便和分别scale_factor[1]
与和scale_factor[3:4]
相乘?scale_factor[2]
[5]
预期结果:
[千] 兆 [百] [十] 萬 千 百 十
[1e+15] 1e+12 [1e+06] [1e+05] 1e+04 1e+03 1e+02 1e+01
可能的解决方案:
w1 <- which(rev(cummax(rev(scale_factor)) > rev(scale_factor)))
grp <- cumsum(c(1,diff(w1)) > 1) + 1
w2 <- aggregate(w1, list(grp), max)[[2]] + 1
scale_factor[w1] <- scale_factor[w1] * scale_factor[w2][grp]
这使:
> scale_factor 千 兆 百 十 萬 千 百 十 1e+15 1e+12 1e+06 1e+05 1e+04 1e+03 1e+02 1e+01
这是做什么的:
cummax(rev(scale_factor))
您一起获得反向标尺的累积最大值。cummax(rev(scale_factor)) > rev(scale_factor)
)比较,得出一个逻辑向量。rev
,which
然后再得到w1
不符合递减条件的位置的索引向量。cumsum(c(1,diff(w1)) > 1) + 1
您可以将示例数据中第3个和第4个值的大小写位置分组。aggregate(w1, list(grp), function(x) max(x) + 1)[[2]]
您一起确定乘数的位置。scale_factor
中w1
的乘数w2
。您需要w2
使用中的组号进行索引grp
。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句