查找正确的舍入值以输出非 0 值

Finding the correct rounding value to output non-0 values

提问人:Yacine Hajji 提问时间:11/14/2023 更新时间:11/14/2023 访问量:73

问:

我有一个十进制数向量,范围从 -10 到 10,具有不同的十进制深度。

我想输出此向量的舍入版本,以便所有数字在最后显示非 0 小数的十进制数级别四舍五入(例如,0.0040 在 0.1000 之后显示非 0 小数,舍入应为 3)。我的目标是在对向量进行舍入后始终输出非 0 值。

在以下示例中,显示第一个非 0 值的十进制数为 0.000100,因此所有数字都应四舍五入为 4。该值不应四舍五入为 6,因为它已经不同于 0。1.000002

### Initiating vector of values, only 0s and 1s should be displayed because the deepest decimal level is 4. 2s should not be displayed
tmpVector <- c(0.111120, -11.011102, 0.001100, 0.000100, 1.000002, -0.101022)

### Correct rounding
round(tmpVector, 4)

[1] 0.1111 -11.0111   0.0011   0.0001   1.0000  -0.1010

我想找到一种自动方法,我可以用 .round(tmpVector, 4)round(tmpVector, deepestLevel)

找不到其他版本的功能来解决这个问题。round()

R 舍入

评论

2赞 R18 11/14/2023
我认为这个问题可以通过在 (-1, 1) 中找到这些数字的最小绝对值来解决。问题在于 R 以其科学记数法解释数字,并且不容易找到非零值出现的位置。
0赞 Yacine Hajji 11/14/2023
谢谢,正则表达式公式似乎适用于该示例,但不适用于以下公式: -> 。Ps:我想你删除了你的评论tmpVector <- c(0.000001, 0.1)0
0赞 PGSA 11/14/2023
它可能不适合您的演示文稿,但这似乎是科学记数法的理想候选者?
0赞 Yacine Hajji 11/14/2023
@Paul我同意科学记数法可能很有趣,但不幸的是,它使科学领域以外的人难以阅读

答:

2赞 PGSA 11/14/2023 #1

好的,我们可以像这样提取最低指数:

tmpVector[tmpVector!=0] |> # remove zeros
  abs() |> # some values are negative - we don't care
  log10() |> # log gives us the exponent
   min() |>  # find the smallest
  floor() |> # make an integer
  abs() # stop it being negative

# gives:
4

然后将其合并到:round()

round(tmpVector, tmpVector[tmpVector!=0] |> abs() |> log10() |> min() |> floor() |> abs())
[1]   0.1111 -11.0111   0.0011   0.0001   1.0000  -0.1010

或避免使用管道符号:

round(tmpVector, abs(floor(min(log10(abs(tmpVector[tmpVector!=0]))))))

评论

0赞 PGSA 11/14/2023
顺便说一句,我敢肯定有一种不那么复杂的方法可以做到这一点。我只是不知道。
1赞 user2554330 11/14/2023
它只是因为您使用的管道而变得复杂。在这种情况下,标准符号看起来更简单(至少对我来说):.顺便说一句,如果有任何零,代码将失败;应首先将其删除。abs(floor(min(log10(abs(tmpVector)))))
0赞 PGSA 11/14/2023
没错,我没有考虑过零会是一个问题。
2赞 Yacine Hajji 11/14/2023
谢谢你,谢谢你的解释。我用以下内容更新了代码,以确保它适用于 0:abs(floor(min(log10(abs(tmpVector[tmpVector!=0])))))
1赞 PGSA 11/14/2023
@user2554330纳入了避免零值和非管道符号的建议,谢谢。