在R的tidyverse中如何强制0、1等数值显示两位小数?
解决数据框数值强制显示两位小数的问题
你的问题出在round()函数的作用上:它只是对数值进行四舍五入计算,并不会改变R对数值的显示规则——R会自动省略末尾无意义的0,所以0、0.5这类值会显示成整数或一位小数。要强制显示两位小数,需要用格式化函数来处理。
可行的tidyverse解决方案
转成带两位小数的字符型(最直接)
使用format()函数结合nsmall=2参数,先四舍五入再格式化:mutate_at(vars(-N), funs(format(round(., 2), nsmall = 2)))如果你的tidyverse版本较新,推荐使用
across()替代已软弃用的mutate_at():mutate(across(-N, ~ format(round(.x, 2), nsmall = 2)))用
sprintf()格式化
效果和上面一致,语法更简洁:mutate_at(vars(-N), funs(sprintf("%.2f", round(., 2)))) # 新版本写法 mutate(across(-N, ~ sprintf("%.2f", round(.x, 2))))全局设置显示规则(不推荐,影响全局)
如果你想保持数值类型不变,仅在查看时显示两位小数,可以设置全局选项:options(digits = 2)但这个设置会作用于所有数值的显示,可能影响其他数据的查看。
你之前代码报错的原因
你错误地把nsmall=2放在了round()函数的参数里,nsmall是format()的参数,必须嵌套在格式化函数中使用,不能直接和round()联用。
内容的提问来源于stack exchange,提问作者William Hutson
相关产品推荐
相关产品推荐

