如何解决dplyr中mutate对除法运算自动静默取整的问题
解决Tibble显示小数被取整的问题
这个问题其实不是计算过程被取整了,而是tibble默认的输出格式为了简洁,只显示了3位小数,但实际计算的精确数值并没有丢失。我们可以通过调整显示设置来看到完整的小数位,下面是几种可行的方法:
1. 先验证精确值是否存在
首先可以确认一下,你的rate列实际存储的是精确数值,只是显示被简化了:
dat_rate <- dat %>% mutate(rate = mapped_reads/nof_reads) # 直接提取rate列查看原始值 dat_rate$rate
输出会是:
[1] 0.9999237 0.9999279 0.9999247
2. 调整Tibble的全局显示选项
Tibble使用pillar包来格式化输出,我们可以通过设置全局选项来增加显示的有效数字位数:
# 设置显示7位有效数字,你可以根据需要调整这个数字 options(pillar.sigfig = 7) # 再次运行你的代码 dat %>% mutate(rate = mapped_reads/nof_reads)
此时输出会显示完整的小数位:
# A tibble: 3 x 4 sid nof_reads mapped_reads rate <chr> <int> <int> <dbl> 1 MK1 19786677 19785168 0.9999237 2 MK2 29531664 29529532 0.9999279 3 MK3 1195340 1195250 0.9999247
如果想恢复默认设置,只需要运行options(pillar.sigfig = NULL)即可。
3. 强制用普通Data Frame格式输出
如果你只是临时想查看完整的小数,也可以将结果转为普通data frame格式输出:
dat %>% mutate(rate = mapped_reads/nof_reads) %>% print.data.frame()
输出效果:
sid nof_reads mapped_reads rate 1 MK1 19786677 19785168 0.9999237 2 MK2 29531664 29529532 0.9999279 3 MK3 1195340 1195250 0.9999247
4. 显式格式化数值(不推荐用于后续计算)
如果需要将数值格式化为固定小数位的字符串(注意这会将数值转为字符类型,不适合后续计算),可以用sprintf:
dat %>% mutate(rate = sprintf("%.7f", mapped_reads/nof_reads))
总结一下:你的计算本身是正确的,只是tibble的默认显示简化了输出,调整显示设置就能看到精确的小数啦!
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

