8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 R 中格式化小数位

DOKARR 2月前

217 0

我有一个数字,例如 1.128347132904321674821,我想在输出到屏幕(或写入文件)时仅显示两位小数。该怎么做?x <- 1。

我有一个数字,例如 1.128347132904321674821,我想在输出到屏幕(或写入文件)时仅显示两位小数。该怎么做?

x <- 1.128347132904321674821

编辑:

使用:

options(digits=2)

已建议将其作为可能的答案。有没有办法在脚本中指定一次性使用?当我将其添加到脚本中时,它似乎没有做任何不同的事情,而且我也不想重新输入大量内容来格式化每个数字(我正在自动生成一份非常大的报告)。

--

答案:round(x, digits=2)

帖子版权声明 1、本帖标题:在 R 中格式化小数位
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由DOKARR在本站《object》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 这是我从单位到百万的方法。数字参数让我调整有效值的最小数量(整数 + 小数)。您可以先调整内部的小数舍入。

    number <-function(number){
      result <- if_else(
        abs(number) < 1000000,
        format(
          number, digits = 3,
          big.mark = ".",
          decimal.mark = ","
        ),
        paste0(
          format(
            number/1000000,
            digits = 3,
            drop0trailing = TRUE,
            big.mark = ".",
            decimal.mark = ","
          ),
          "MM"
        )
      )
      # result <- paste0("$", result)
      return(result)
    }
    
  • 10.59648 四舍五入 2 位数字后得到 10.59。难道不应该是 10.60 吗?0.9995 也是一样,结果应该是 1.00,而不是 0.99。

  • 我编写了这个函数,虽然还有改进空间,但看起来在极端情况下效果很好。例如,在 0.9995 的情况下,投票正确答案给出的是 1.00,这是不正确的。我在数字没有小数的情况下使用该解决方案。

    round_correct <- function(x, digits, chars = TRUE) {
      if(grepl(x = x, pattern = "\\.")) {
        y <- as.character(x)
        pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
        if(chars) {
          return(substr(x = x, start = 1, stop = pos + digits))
        }
        return(
          as.numeric(substr(x = x, start = 1, stop = pos + digits))
        )
      } else {
        return(
          format(round(x, 2), nsmall = 2)
        )
      }
    }
    

    例子:

    round_correct(10.59648, digits = 2)
    [1] "10.59"
    round_correct(0.9995, digits = 2)
    [1] "0.99"
    round_correct(10, digits = 2)
    [1] "10.00"
    
  • library(dplyr)
    # round the numbers
    df <- df %>%
      mutate(across(where(is.numeric), .fns = function(x) {format(round(x, 2), nsmall = 2)}))
    

    这里我把所有数值改为只有 2 位小数。如果你需要把它改成更多的小数位

    # round the numbers for k decimal places
    df <- df %>%
      mutate(across(where(is.numeric), .fns = function(x) {format(round(x, k), nsmall = k)}))
    

    将 k 替换为所需的小数位数

  • 如果你只想对数字或列表进行舍入,只需使用

    round(data, 2)
    

    然后,数据将四舍五入到小数点后 2 位。

  • 也许根据提供的链接尝试 format.default(x, digits = 2) 只是一种尝试。我通常阅读的文档中缺少这些信息,我还希望看到打印输出。

  • 嗯,你看过这个输出是什么了吗?[1] \'1.128347\' 否则,你说它在基础包中是完全正确的,我的错。

  • @brandon,format() 是 base 的一部分。打开 R 并输入 ?format ... 不需要任何包。

  • 在我看来就像

    library(tutoR)
    format(1.128347132904321674821, 2)
    

    根据 网上帮助 .

  • 双精度 存储 ,这为您提供(大约)16 位十进制数字的精度 - 其余的将是噪音。我承认上面显示的数字可能只是一个例子,但它有 22 位数字长。

  • 我使用这个变体强制打印 K 个小数位:

    # format numeric value to K decimal places
    formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
    
  • 此函数 formatC() 可用于将数字格式化为两位小数。即使结果值包含尾随零,此函数也会给出两位小数。

  • 我认为原帖是在固定小数位之后,而不是固定数字。看来你答案中的 g 代表固定数字,使用 f 效果更好。

  • @jangorecki 我不太确定你的意思。我所做的一切(5 年前)就是建议更正拼写。

  • 检查函数 prettyNum,格式

    要进行试验零(例如 123.1240),请使用 sprintf(x, fmt='%#.4g')

  • @JeromyAnglim 当我们需要 3sf 时,如何解决这个问题?有时它会给我 3sf,有时给我 4sf,等等。我们该如何解决这个问题?

  • signif 适用于提供的特定数字,但我推测常见的应用问题是当您需要精确显示两位小数但事先不知道数字是多少时。在这种情况下,signif 将根据实际数字给出不同的小数位数。

  • 谢谢 Paul。这两个不是我所寻找的,但 signif 引导我找到了 round(),这正是我需要的。干杯,

  • 如果您更喜欢有效数字而不是固定数字,那么 signif 命令可能会有用:

    > signif(1.12345, digits = 3)
    [1] 1.12
    > signif(12.12345, digits = 3)
    [1] 12.1
    > signif(12345.12345, digits = 3)
    [1] 12300
    
返回
作者最近主题: