Отрегулируйте значения подмножества векторов в соответствии с определенными правилами - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь закодировать функцию, которая преобразует китайские цифры в арабские. Идея состоит в том, чтобы получить набор 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 

1 Ответ

0 голосов
/ 02 мая 2018

Возможное решение:

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 впоследствии, вы получите индексный вектор позиций w1, которые не соответствуют уменьшающемуся условию.
  4. С помощью cumsum(c(1,diff(w1)) > 1) + 1 вы можете сгруппировать эти позиции для случая 3-го и 4-го значений в данных примера.
  5. С помощью aggregate(w1, list(grp), function(x) max(x) + 1)[[2]] вы определяете позиции множителей.
  6. Наконец, вы умножаете значения в scale_factor, как определено в w1, на множители из w2. Вам нужно индексировать w2 с номерами групп от grp.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...