将数据帧保存到 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")
这就是您所需要的。
我有一个 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")
这就是您所需要的。