舍入小数点后的位数(避免为零)

问题描述 投票:0回答:2

我想做什么

我想根据它们的实际小数位舍入大数据集的所有数值。

例如对于iris数据集,我想将所有数字四舍五入,将小数点后一位的数字四舍五入为整数,将小数点后两位的数字四舍五入为一位小数(以避免零)。

我尝试了什么

如果使用mutate_ifdigits=0,则Petal.Withsetosa为零

# data and package
library(tidyverse)
iris

iris %>% mutate_if(is.numeric,round,0)

我曾考虑过结合mutate_at和case_when,但是,我不知道如何选择vars

iris %>% mutate_at(.vars = vars(),
          .funs = funs(. = case_when(
            . <0 ~ round(1),
            TRUE ~ round(0))))

我读到vars()的作用类似于select(),但是没有vars_if()的作用类似于select_if()

r rounding tidyverse
2个回答
1
投票

您可以只计算点后的数字并四舍五入到该值-1,即

x <- c(4.5, 2.12, 3, 5.245)
i1 <- nchar(sub('.*\\.', '', x))

round(x, (i1-1))
#[1] 4.00 2.10 3.00 5.25

0
投票

您可以使用通过将小数点后的数字计数来删除最后一位有效数字的函数,如下所示:

drop_sigfig <- function(x)
{
  sapply(as.list(x), function(y)
  {
    if(grepl("^\\d+[.](\\d+)$", as.character(y)))
    {
      round(y, nchar(gsub("^\\d+[.](\\d+)$", "\\1", as.character(y))) - 1)
    }
    else y
  })
}

哪个像这样:

drop_sigfig(c(22.2, 21.1, 22.3))
#> [1] 22 21 22

drop_sigfig(c(21.1, 22.32, 23.345, 25.6547543))
#> [1] 21.00000 22.30000 23.34000 25.65475

然后您可以做:

iris %>% mutate_if(is.numeric, drop_sigfig)

但是,由于iris在其数字中只有一个小数位,因此这为所有列提供了整数值。

© www.soinside.com 2019 - 2024. All rights reserved.