取以下 vector 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
    

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

    最佳答案

    我借鉴了您以前的努力,并取得了一些良好的效果:

    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
    

    关于r - 重新格式化数值而不强制使用字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25344123/

    10-12 22:31