提问人:Yacine Hajji 提问时间:11/14/2023 更新时间:11/14/2023 访问量:73
查找正确的舍入值以输出非 0 值
Finding the correct rounding value to output non-0 values
问:
我有一个十进制数向量,范围从 -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()
答:
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纳入了避免零值和非管道符号的建议,谢谢。
评论
tmpVector <- c(0.000001, 0.1)
0