R:十进制上限

时间:2016-03-04 22:52:21

标签: r numbers rounding

我需要ceilingfloor函数的十进制变体。像signif这样的东西,可以选择在哪个方向进行舍入。

例如,我需要将数字2.63转换为2.7,而不是3(ceiling)或2.6(signif(2.63,2))。

我能想到的唯一解决方法是乘以10,然后取ceiling再除以10。 ceiling(2.63*10)/10
我敢肯定,必须有一个更优雅的解决方案。

我的问题与this one非常相似。

3 个答案:

答案 0 :(得分:12)

@ 42-评论中的答案似乎太有用了,不能留在评论中,因此这个wiki-post。

您可以创建自己的功能并调整floorceiling功能,添加level选项以模仿此digits功能的round参数:

floor_dec <- function(x, level=1) round(x - 5*10^(-level-1), level)
ceiling_dec <- function(x, level=1) round(x + 5*10^(-level-1), level)

<强>示例:

# floor
floor_dec(1.259, 2)
[1] 1.25
floor_dec(1.9, 0)
[1] 1
floor_dec(29, -1)
[1] 20
floor_dec(1.251, 2)
[1] 1.25
floor_dec(1.2, 0)
[1] 1
floor_dec(23, -1)
[1] 20

# ceiling
ceiling_dec(1.259, 2)
[1] 1.26
ceiling_dec(1.9, 0)
[1] 2
ceiling_dec(29, -1)
[1] 30
ceiling_dec(1.251, 2)
[1] 1.26
ceiling_dec(1.2, 0)
[1] 2
ceiling_dec(23, -1)
[1] 30

答案 1 :(得分:0)

此答案在先前答案的注释中没有问题,尽管可悲的是基于OP中不需要的答案:

customCeiling <- function(x, Decimals=1) {
  x2<-x*10^Decimals
  ceiling(x2)/10^Decimals
}

customFloor <- function(x, Decimals=1) {
  x2<-x*10^Decimals
  floor(x2)/10^Decimals
}

答案 2 :(得分:0)

我想定义一个与@42 非常相似的函数。我想定义 sig figs 的数量,而不是用你想要的小数位数来定义 floor 函数:

floor_dec <- function(x, sigDig=1) {
  mostSig = ceiling(log10(abs(x)))
  floor(x*10^(sigDig-mostSig))*10^-(sigDig-mostSig)
}

> floor_dec(21.259, 4)
[1] 21.25
> floor_dec(21.259, 3)
[1] 21.2
> floor_dec(21.259, 2)
[1] 21
> floor_dec(21.259, 1)
[1] 20
> floor_dec(.259, 4)
[1] 0.259
> floor_dec(.259, 3)
[1] 0.259
> floor_dec(.259, 2)
[1] 0.25
> floor_dec(.259, 1)
[1] 0.2
> floor_dec(1.2, 0)
[1] 0
> floor_dec(23, -1)
[1] 0

请注意,sigDif 需要正整数作为输入。就像提示者猜测的那样,我找到最高有效数字的位置,移动适当楼层的小数位,然后移动小数位,使输入的最高有效数字与输出相同。