四舍五入到有效数字*仅*和数字的十进制部分(R)

四舍五入到有效数字*仅*和数字的十进制部分(R),r,rounding,significant-digits,R,Rounding,Significant Digits,signif()函数根据指定的输入数量对值进行舍入 给定值中的有效数字。该函数适用于所有 但是,数字中的数字表示不同数量的 震级的舍入和截断方式不同。比如说这个, 向量x x[[1]] #> [1] 100 #> #> [[2]] #> [1] 10 #> #> [[3]] #> [1] 1.3 #> #> [[4]] #> [1] 0.00034 …第一个和第二个值被截断为100和10,而 十进制值消失,而第三和第四个值保持不变 小数(尽管数字不同)。这是来自的预期输出 signif(

signif()
函数根据指定的输入数量对值进行舍入 给定值中的有效数字。该函数适用于所有 但是,数字中的数字表示不同数量的 震级的舍入和截断方式不同。比如说这个, 向量
x

x[[1]]
#> [1] 100
#> 
#> [[2]]
#> [1] 10
#> 
#> [[3]]
#> [1] 1.3
#> 
#> [[4]]
#> [1] 0.00034
…第一个和第二个值被截断为100和10,而 十进制值消失,而第三和第四个值保持不变 小数(尽管数字不同)。这是来自的预期输出
signif()
-当 确定显著性

是否可以忽略每个数字的整数部分,而只忽略格式 小数部分包含一组有效数字?我想去 能够返回这些值:
c(100.13,10.034,1.34,0.00034)
;那个 是,
前面的完整整数,后跟有效值 数字的小数部分的位数

现在,我创建了一个函数,将值分为整数和整数 分数组件并仅在分数组件上运行
signif()
, 但这似乎异常骇人

签名忽略整数[[1]]
#> [1] 100.13
#> 
#> [[2]]
#> [1] 10.034
#> 
#> [[3]]
#> [1] 1.34
#> 
#> [[4]]
#> [1] 0.00034
有没有更好的、更推荐的方法(可能有点花哨)
sprintf()

忽略数字的整数成分?

可能有更好的方法,但您的一般方法似乎并不不合理。但是,您可以通过使用
floor
、利用矢量化避免
lapply
、以及使用mod运算符返回每个数字的小数部分来简化它:

my_signif = function(x, digits) floor(x) + signif(x %% 1, digits)

my_signif(x, 2)

也许有更好的方法,但你的方法似乎并不不合理。但是您可以通过使用
floor
并利用矢量化来简化它,以避免
lappy
my_signif=函数(x,数字)floor(x)+signif(x-floor(x,数字);我的签名(x,2)
哦,太好了,知道这不是不合理的,这让我很放心。我意识到有一个更精简的方法,我已经发布作为答案(并且@Ryan刚刚在一个(现在已删除)评论中发布了)。看起来预格式化的数字(
sprintf
formatC
)不要支持你正在尝试做的事情。请查看帮助文件
?format c
中有关digits参数的文本。“f”支持小数点后的位数,而其他类似“g”的支持显示有效位数。这里有一个sprint方法,虽然它不太漂亮:
temp我猜速度可能不是问题,但出于某种原因
trunc
floor
快一点。它看起来像
trunc()
以负数分隔:
我的签名(-10.03421,2)
=-9.03。将其替换为
floor()
将给出-10.03的正确结果
[1] 100.13000  10.03400   1.34000   0.00034