矢量从文本文件中读取不同于在控制台中生成的相同矢量

时间:2012-11-02 11:41:55

标签: r input

  

可能重复:
  Why are these numbers not equal?

我遇到了一个非常奇怪的情况。如果我使用以下代码将矢量(序列)存储在文本文件中:

fileConn<-file('test.txt')
sink(fileConn,append=T,split=T)
cat('sequence','\n')
cat(as.character(unlist(seq(0,1,0.1))),'\n')
sink()
close(fileConn)

然后再次加载:

test=readLines('test.txt')

然后我尝试提取我存储在文本文件中的相同载体,并使用2种“不同”方法与原始序列进行比较:

sequence1=laply(strsplit(test[2]," ")[[1]],as.numeric)
sequence2=as.numeric(strsplit(test[2]," ")[[1]])

奇怪的是,即使他们看起来和(显然)是同一类型的载体,R似乎认为它们不是!!!

cbind(seq(0,1,0.1),sequence1,sequence2)

          sequence1 sequence2
 [1,] 0.0       0.0       0.0
 [2,] 0.1       0.1       0.1
 [3,] 0.2       0.2       0.2
 [4,] 0.3       0.3       0.3
 [5,] 0.4       0.4       0.4
 [6,] 0.5       0.5       0.5
 [7,] 0.6       0.6       0.6
 [8,] 0.7       0.7       0.7
 [9,] 0.8       0.8       0.8
[10,] 0.9       0.9       0.9
[11,] 1.0       1.0       1.0

apply(cbind(seq(0,1,0.1),sequence1,sequence2),2,class)
          sequence1 sequence2 
"numeric" "numeric" "numeric"



apply(cbind(seq(0,1,0.1),sequence1,sequence2),2,nchar)
        sequence1 sequence2
 [1,] 1         1         1
 [2,] 3         3         3
 [3,] 3         3         3
 [4,] 3         3         3
 [5,] 3         3         3
 [6,] 3         3         3
 [7,] 3         3         3
 [8,] 3         3         3
 [9,] 3         3         3
[10,] 3         3         3
[11,] 1         1         1

sequence1==seq(0,1,0.1)
 [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

sequence2==seq(0,1,0.1)
 [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

有没有人知道为什么会发生这种情况以及如何阻止它发生? 非常感谢!

2 个答案:

答案 0 :(得分:1)

让我们逐步解决您的问题。转储文件后,我可以检查test.txt

的内容
test=readLines('test.txt')
> test
[1] "sequence "                               
[2] "0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 "

如果我们将其与原始序列进行比较:

> seq(0,1,0.1)
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

我们看到该文件包含正确的内容。所以,你的处理错误。我们检查两个序列是否与转储序列匹配:

> all.equal(sequence1, seq(0,1,0.1))
[1] TRUE
> all.equal(sequence2, seq(0,1,0.1))
[1] TRUE

所以实际上他们是正确的。所以,你声称存在问题是错误的。 FALSE可能是由表示float的数值精度引起的,因此all.equal表示它们是相同的。

答案 1 :(得分:1)

您希望使用all.equal()进行比较,这样可以在比较中进行一些模糊测试。您不能使用==作为完全等效的测试,但这不是 你应该也不想做浮点数据。

> all.equal(unlist(sequence1), seq(0, 1, 0.1))
[1] TRUE
> all.equal(sequence2, seq(0, 1, 0.1))
[1] TRUE

要获得您想要的输出,我们需要更努力地工作:

> sapply(seq_along(sequence1), function(i, x, y) all.equal(x[[i]], y[i]),
+        x = sequence1, y = seq(0, 1, 0.1))
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> sapply(seq_along(sequence2), function(i, x, y) all.equal(x[i], y[i]),
+        x = sequence2, y = seq(0, 1, 0.1))
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

请注意最后两个略有不同,因为sequence1是一个列表。