采用以下向量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
目前我笨拙地转换为字符,然后返回数字以获得以下所需结果......
> as.numeric(paste0(round(x, 0), sub("0", "", round(x %% 1/3, 1))))
[1] 50.1 195.1 186.0 214.1 247.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得到你想要的变换数。数学上:
我不确定你为什么要用这种方式对你的数字进行编码......有什么特别的原因吗?
您可以考虑将号码更改为&#34;三分之一&#34;并使用modulo 3获取int的部分和number / 3