根据某些规则调整向量子集值

  • 本文关键字:向量 子集 调整 规则 r
  • 更新时间 :
  • 英文 :


我正在尝试编写一个将中文数字转换为阿拉伯语的函数。 这个想法是得到一组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

这样做有什么作用:

  1. 使用cummax(rev(scale_factor)),您可以获得反向刻度的累积最大值。
  2. 将其与反向尺度(cummax(rev(scale_factor)) > rev(scale_factor)(进行比较,得到一个逻辑向量。
  3. 步骤 2 中的逻辑向量包装在 rev 中并随后which,wou 得到不符合递减条件的位置w1的索引向量。
  4. 使用cumsum(c(1,diff(w1)) > 1) + 1您可以将这些位置分组,以应对示例数据中的第 3 个和第 4 个值。
  5. 使用aggregate(w1, list(grp), function(x) max(x) + 1)[[2]]您可以确定乘数的位置。
  6. 最后,您将w1中确定的scale_factor值与 w2 中的乘数相乘。您需要使用grp中的组号为w2编制索引。

最新更新