重新格式化数值而不强制转换为字符

时间:2014-08-16 21:24:24

标签: r

采用以下向量x

x <- c(50.333, 195.333, 186, 214.333, 246.667)

x的小数位始终是零,1/3或2/3(即0.0,0.333或0.667)之一。我想快速将它们各自的小数更改为以下结果

> round(x %% 1/3, 1)
[1] 0.1 0.1 0.0 0.1 0.2

意味着,x

  • 如果0是小数,则它仍为零
  • 如果0.333是小数,则变为0.1
  • 如果0.667是小数,则变为0.2

目前我笨拙地转换为字符,然后返回数字以获得以下所需结果......

> as.numeric(paste0(round(x, 0), sub("0", "", round(x %% 1/3, 1))))
[1]  50.1 195.1 186.0 214.1 247.2

有没有数学方法可以做到这一点,而不必强迫角色?

2 个答案:

答案 0 :(得分:2)

我建立了你以前的努力并取得了一些好成绩:

x <- c(50.333, 195.333, 186, 214.333, 246.667)

stripDecimal <- function(x){
  y <- as.integer(x)
  z <- round(x %% 1/3, 1)
  y+z
}

stripDecimal(x)
[1]  50.1 195.1 186.0 214.1 246.2

答案 1 :(得分:-1)

为什么不简单地得到每个数字的分数并将其除以.333(向上舍入)然后除以10得到你想要的变换数。数学上:

  • intpart = floor(number);
  • fracpart = number -intpart
  • newfracpart =(fracpart / .333)
  • new number = intpart + newfracpart / 10.0

我不确定你为什么要用这种方式对你的数字进行编码......有什么特别的原因吗?

您可以考虑将号码更改为&#34;三分之一&#34;并使用modulo 3获取int的部分和number / 3