gpt4 book ai didi

r - 如何在 R 中格式化数字,指定有效位数但保留有效零和整数部分?

转载 作者:行者123 更新时间:2023-12-03 01:10:00 26 4
gpt4 key购买 nike

我一直在努力使用我认为非常明智的规则来格式化 R 中的数字。我想要的是指定多个有效数字(例如 3 个),保留有效零,并保留小数点之前的所有数字,一些示例(具有 3 个有效数字):

1.23456 -> "1.23"
12.3456 -> "12.3"
123.456 -> "123"
1234.56 -> "1235"
12345.6 -> "12346"
1.50000 -> "1.50"
1.49999 -> "1.50"

R 中是否有函数可以进行这种格式化?如果没有的话,怎么办?

我觉得这些是非常明智的格式化规则,但我还没有设法在 R 中找到以这种方式格式化的函数。据我谷歌搜索,这并不是许多类似问题的重复,例如 this

编辑:

受到这两个好的答案的启发,我自己编写了一个函数,我相信它适用于所有情况:

sign_digits <- function(x,d){
s <- format(x,digits=d)
if(grepl("\\.", s) && ! grepl("e", s)) {
n_sign_digits <- nchar(s) -
max( grepl("\\.", s), attr(regexpr("(^[-0.]*)", s), "match.length") )
n_zeros <- max(0, d - n_sign_digits)
s <- paste(s, paste(rep("0", n_zeros), collapse=""), sep="")
}
s
}

最佳答案

format(num,3) 非常接近。

format(1.23456,digits=3)
# [1] "1.23"
format(12.3456,digits=3)
# [1] "12.3"
format(123.456,digits=3)
# [1] "123"
format(1234.56,digits=3)
# [1] "1235"
format(12345.6,digits=3)
# [1] "12346"
format(1.5000,digits=3)
# [1] "1.5"
format(1.4999,digits=3)
# [1] "1.5"

您的规则实际上内部不一致。您希望 1234.56 向下舍入为 1234,但又希望 1.4999 向上舍入为 1.5。

编辑这似乎解决了@Henrik提出的非常有效的观点。

sigDigits <- function(x,d){
z <- format(x,digits=d)
if (!grepl("[.]",z)) return(z)
require(stringr)
return(str_pad(z,d+1,"right","0"))
}

z <- c(1.23456, 12.3456, 123.456, 1234.56, 12345.6, 1.5000, 1.4999)
sapply(z,sigDigits,d=3)
# [1] "1.23" "12.3" "123" "1235" "12346" "1.50" "1.50"

关于r - 如何在 R 中格式化数字,指定有效位数但保留有效零和整数部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21526038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com