Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:将数据帧保存到CSV时可能会丢失精度?_R_Csv_Dataframe - Fatal编程技术网

R:将数据帧保存到CSV时可能会丢失精度?

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

我在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 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位数字,为了更好地控制,您应该使用设置所需位数的格式将数字列转换为字符。