Округлите числа до ближайшего числа со всеми цифрами, равными нулю, но первой цифрой - PullRequest
0 голосов
/ 13 февраля 2019

Я бы округлил числа, чтобы все цифры равнялись нулю, кроме одного.Так, например, если у меня есть 2341, я бы округлился до 2000 и до 3000, для 324 я бы округлился до 300 и до 400.Есть ли способ округлить числа, чтобы все цифры были нулевыми, кроме первой?В идеале это также должно работать с небольшими числами, поэтому 0.0568 будет округлено до 0.05 и до 0.06.

Функция, подобная roundUp <- function(x) 10^ceiling(log10(x)), округляется до ближайшей степени 10 [или более низкой мощности при изменении ceiling на floor), но в этом случае 324 будет округляться до 1000, тогда какЯ бы округлил его до 400 и до 300.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

я думаю, что следующая функция делает то, что вы хотите, работала для всех примеров, также отрицательные значения:

special_round <- function(x, type)
{
  z = floor(log10(abs(x)))
  y = 10^z
  res = x/y
  if(type == "up" )
  { 
    res <- ceiling(res)
  }
  if(type == "down")
  {    
    res <- floor(res)
  }
  return(res*y)
}
0 голосов
/ 14 февраля 2019

После ответа @Michael Lugo, но, сделав его способным обрабатывать отрицательные числа (например, ответ @Stefan Zechner), а также добавив округления вверх и вниз, я сделал следующее.

round_to_zeros = function(x, num.sig.figs = 1, round.down = TRUE){
  initial.x <- as.numeric(x)
  if(x == 0){return(0)}
  if(x < 0){x <- (-1*x)}
  power_of_ten = floor(log(x, 10))

  number_down <- round(floor(x/10^power_of_ten), num.sig.figs-1)*10^power_of_ten
  number_up   <- round( x /10^power_of_ten, num.sig.figs-1)*10^power_of_ten

  if(initial.x < 0){
    if(round.down==TRUE){return(-1*number_up)} else {return(-1*number_down)} }

  if(round.down==TRUE){return(number_down)} else {return(number_up)}
}

Это округление вверх и вниз и имеет дело как с отрицательными, так и с положительными числами.

0 голосов
/ 13 февраля 2019

Эта функция округляет x до num.sig.figs значащих цифр.(Вы хотите округлить до 1 значащей цифры.)

round_sigfigs = function(x, num.sig.figs = 1){
  power_of_ten = floor(log(x, 10))
  return(round(x/10^power_of_ten, num.sig.figs-1)*10^power_of_ten)
}

Например: round_sigfigs(2341, 1) равно 2000 и round_sigfigs(0.0568, 1) равно 0.06, как и требовалось.round_sigfigs(2341, 2) равно 2300, округление до двух мест.

Встроенная функция R signif обрабатывает это автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...