我想做什么
我想根据它们的实际小数位舍入大数据集的所有数值。
例如对于iris
数据集,我想将所有数字四舍五入,将小数点后一位的数字四舍五入为整数,将小数点后两位的数字四舍五入为一位小数(以避免零)。
我尝试了什么
如果使用mutate_if
和digits=0
,则Petal.With
的setosa
为零
# 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()
您可以只计算点后的数字并四舍五入到该值-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
您可以使用通过将小数点后的数字计数来删除最后一位有效数字的函数,如下所示:
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
在其数字中只有一个小数位,因此这为所有列提供了整数值。