R:将数据帧保存到CSV时可能会丢失精度?
我在R中偶然发现了一个奇怪的行为,R:将数据帧保存到CSV时可能会丢失精度?,r,csv,dataframe,R,Csv,Dataframe,我在R中偶然发现了一个奇怪的行为,double值没有作为原始值保存到CSV中 可复制示例: set.seed(1) df <- data.frame(ID = 1:10, X = rnorm(10)) write.csv(df, "test.csv", row.names = F) read.csv("test.csv") == df ID X [1,] TRUE FALSE [2,] TRUE FALSE [3,] TRUE FALSE [4,] TRUE
double
值没有作为原始值保存到CSV中
可复制示例:
set.seed(1)
df <- data.frame(ID = 1:10, X = rnorm(10))
write.csv(df, "test.csv", row.names = F)
read.csv("test.csv") == df
ID X
[1,] TRUE FALSE
[2,] TRUE FALSE
[3,] TRUE FALSE
[4,] TRUE FALSE
[5,] TRUE FALSE
[6,] TRUE FALSE
[7,] TRUE FALSE
[8,] TRUE FALSE
[9,] TRUE FALSE
[10,] TRUE TRUE
有没有办法绕过这个问题?这是一个已知的错误吗?正如评论中指出的,问题中的测试不是考虑机器精度的正确方法 出于存档目的,正确的测试是
all.equal
:
all.equal(read.csv("test.csv"), df)
[1] TRUE
正如评论中所指出的,制造商解释说,问题中的测试不是考虑机器精度的正确方法 出于存档目的,正确的测试是
all.equal
:
all.equal(read.csv("test.csv"), df)
[1] TRUE
如果您想提高
write.csv
函数的精度,可以使用sprintf
实现。“%.20f
”将确保前20位数字相同,这足以让R得出数字相等的结论
set.seed(1)
df <- data.frame(ID = 1:10, X = rnorm(10))
write.csv(data.frame(df$ID, newX =sprintf("%.20f",df$X)), "test.csv",
row.names = F)
x <- read.csv("test.csv")
x == df
#df.ID newX
[1,] TRUE TRUE
[2,] TRUE TRUE
[3,] TRUE TRUE
[4,] TRUE TRUE
[5,] TRUE TRUE
[6,] TRUE TRUE
[7,] TRUE TRUE
[8,] TRUE TRUE
[9,] TRUE TRUE
[10,] TRUE TRUE
set.seed(1)
df如果您想提高write.csv
函数的精度,可以通过sprintf
实现。“%.20f
”将确保前20位数字相同,这足以让R得出数字相等的结论
set.seed(1)
df <- data.frame(ID = 1:10, X = rnorm(10))
write.csv(data.frame(df$ID, newX =sprintf("%.20f",df$X)), "test.csv",
row.names = F)
x <- read.csv("test.csv")
x == df
#df.ID newX
[1,] TRUE TRUE
[2,] TRUE TRUE
[3,] TRUE TRUE
[4,] TRUE TRUE
[5,] TRUE TRUE
[6,] TRUE TRUE
[7,] TRUE TRUE
[8,] TRUE TRUE
[9,] TRUE TRUE
[10,] TRUE TRUE
set.seed(1)
谢谢@alistaire。我忘记了all.equal
,我真傻。检查?write.table
->详细信息:默认情况下,它在csv中写入15位数字,为了更好地控制,您应该使用设置所需位数的格式将数字列转换为字符。谢谢@alistaire。我忘记了all.equal
,我真傻。检查?write.table
->详细信息:默认情况下,它在csv中写入15位数字,为了更好地控制,您应该使用设置所需位数的格式将数字列转换为字符。