Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据特定规则调整向量子集值_R - Fatal编程技术网

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