将数据帧保存到 R 中的 dbf 时如何控制数据精度

How to control over data precision when saving dataframe to dbf in R

我有一个 dbf 格式的文件,我想将其读入 R 并进行一些小操作。

library(foreign)
library(dplyr)
library(spsurvey)

### set working directory
coverage <- foreign::read.dbf("coverage.dbf")

coverage_adj <- mutate(coverage, VAR1 = replace(VAR1, VAR2 == "X" & VAR1 == "Y", "Z" ))

write.dbf(coverage_adj, "coverage_adj.dbf")

一切都如我所料,尽管事实上,覆盖范围 table 中的数字列在保存后失去了精度。

例如列 VAR3 最初是一个带 2 个小数点的数字。这是它在 R 中的显示方式:

> head(coverage$VAR3)
[1]  163.78   34.61 1063.97  212.78    6.93   91.46

在 R 中调整后的 table 看起来也不错,因此带有 2 个小数点的数字:

> head(coverage_adj$VAR3)
[1]  163.78   34.61 1063.97  212.78    6.93   91.46

但是在 write.dbf() 之后,如果我在 FoxPro 的 Excel 中打开保存的文件,我可以看到:

163.780000000000000 34.609999999999900 1063.970000000000000 212.780000000000000

有没有办法在从 R 保存 dbf 的同时保留数据类型及其精度?

如果您想更深入地了解发生这种情况的原因,请查看 R Inferno 的第一个圆圈(快速简单的阅读)。基本上 R 存储你的浮点数有一个数字错误,但是当你显示 head(coverage_adj$VAR3) 时它隐藏了它。

在您的情况下,最简单的做法是在再次保存之前对您的数据使用 round(..., digits=2),例如:

write.dbf(round(coverage_adj, digits=2), "coverage_adj.dbf")

这就是您所需要的。