使用mutate_if()无法实现tibble数值列小数位数限制的问题
Tibble数值列固定小数位数格式化问题解决记录
最近我创建了一个包含字符列和数值列的tibble:
set.seed(123) df <- tibble( x = sample(LETTERS[1:3],10,T), y = rdunif(10,7.5), z = rdunif(10,7.5) )
我的需求是限制数值列的小数位数,一开始尝试用mutate_if()结合round()函数处理:
df %>% mutate_if(is.numeric, funs(round(., 1)))
结果执行后数据看起来完全没变化,也没有任何警告信息,这让我有点困惑。
问题根源
后来我才明白,round()的作用是对数值进行四舍五入计算,但它返回的还是数值类型。tibble在显示数值时,默认会根据数据的实际存储精度来展示,不会强制固定小数位数——也就是说,虽然数值已经被四舍五入了,但显示上和原数据没区别(可以用str(df)查看实际数值的变化)。如果我们要的是固定小数位数的格式化显示,而不是单纯的数值计算,round()就不是合适的工具。
正确处理方式
要实现固定小数位数的格式化效果,应该使用base R中的sprintf()函数,它会把数值转换成指定格式的字符型数据,从而让数值列以我们想要的小数位数呈现:
df %>% mutate_if(is.numeric, funs(sprintf("%0.1f", .)))
这样处理后,数值列就会稳定显示1位小数,完美满足需求。
内容的提问来源于stack exchange,提问作者elliot
相关产品推荐
相关产品推荐

