我遇到了一个非常奇怪的情况。如果我使用以下代码将矢量(序列)存储在文本文件中:
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
有没有人知道为什么会发生这种情况以及如何阻止它发生? 非常感谢!
答案 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
是一个列表。