R 根据特定规则调整向量子集值
我正在尝试编写一个将中文数字转换为阿拉伯语的函数。 其思想是获得一组R 根据特定规则调整向量子集值,r,R,我正在尝试编写一个将中文数字转换为阿拉伯语的函数。 其思想是获得一组scale\u digit向量和一组scale\u 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^4s(萬)
scale\u digit
向量和一组scale\u 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
s(萬) 还有几千个10^12
s(兆), 剩下的是一个比例因子向量,如下所示:
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
待调整的比例系数已标记为[]
基数比例因子的位置可以通过以下代码找到:
cardinal_scale_factor=which(diff(scale_factor)>=0, T)+1
兆 萬
2 5
如何进行编码,使比例系数[1]
和比例系数[3:4]
分别乘以比例系数[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]
它的作用是:
使用cummax(rev(scale\u factor))
可获得反向刻度的累积最大值
将其与反向比例(cummax(rev(scale\u factor))>rev(scale\u factor)
)进行比较,给出了一个逻辑向量
将步骤2中的逻辑向量包装在rev
和中,随后将得到不符合递减条件的位置w1
的索引向量
使用cumsum(c(1,diff(w1))>1)+1
可以将这些位置分组,以获得示例数据中的第三个和第四个值
使用aggregate(w1,list(grp),function(x)max(x)+1)[[2]]
确定乘法器的位置
最后,将w1
中确定的scale\u factor
中的值与w2
中的乘数相乘。需要使用grp
中的组号对w2
进行索引
下一个逻辑步骤的一个尝试是:mapply(seq,cardinal\u scale\u factor)$兆 [1] 1 2 $萬 [1] 1 2 3 4 5
有什么想法可以从这里继续吗?我可能想把上面的结果变形为:$兆 [1] 1 $萬 [1] 3 4
,那么剩下的应该很简单。我不明白这个问题,也不明白你想做什么。你为什么要乘以这些向量,它与阿拉伯语有什么关系?你为什么要计算diff
?为什么diff>=0
很重要?你为什么要乘以scale\u factor[1]
和scale\u factor[3:4]
按比例系数[2]
和[5]
?为什么特别是这些条目,其余条目呢?我完全不了解这方面的情况question@DavidArenburg,基本上,在中文数字系统中,有表示刻度(10^x)的乘数在它前面的某个数字。我们在这里处理的一个尺度是广域网,相当于一万(10^4),所以现在我有几十万(比如说,250)在我的数字中。但是scale\u因子
向量没有反映这一点。因此250*10^4
只是计算为250,这不是我需要的。在一个简单的情况下,scale\u因子
向量应该总是从左到右递减。例如300万、2500万和1。所以我们有10^6、10^3、10^2
>按顺序。当我们的数字有21万时,情况会变得复杂,因为10^2和10^1会夹在10^6和10^3这两个基数因子之间,这就是为什么我们需要把它们挑选出来,然后乘以它们各自的基数因子。
> scale_factor
千 兆 百 十 萬 千 百 十
1e+15 1e+12 1e+06 1e+05 1e+04 1e+03 1e+02 1e+01