2015-07-21 86 views
2

我有一个dbf格式的文件,我想将它读入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") 

尽管事实上,尽管事实上,覆盖表中的数字列在保存后失去了精度,但一切正常。

例如,列VAR3最初是一个带有2个小数点的数字。这是怎么回事显示R:

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

R中调整表看起来也那么好与数字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?

+0

这是在R地狱的第一章中介绍的。其中一个想法是在用'round(...,digits = 2)'操作后简单地舍入结果' – mts

+0

@mts这是否意味着在保存dbf之前,我必须将每个数值舍入到dbf中指定的类型? –

+0

这取决于事后精确度对您的使用有多重要。在你的情况下,差异体现在第10位。而如果不会受到伤害,你应该知道它是否值得你的麻烦 – mts

回答

1

如果您想了解更多信息,请查看R Inferno(快速简单阅读)的第一个圆圈。基本上R是存储你的浮点数值错误,但当显示你head(coverage_adj$VAR3)它是隐藏的。

在你的情况最简单的事情是重新保存,e.g之前使用您的数据round(..., digits=2)

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

这应该是你所需要的。