2

重複の可能性:
これらの数値が等しくないのはなぜですか?

私は非常に奇妙な状況に遭遇しました。次のコードを使用して、ベクター (シーケンス) をテキスト ファイルに保存するとします。

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

なぜこれが起こるのか、どうすればそれを防ぐことができるのか、誰にも手がかりがありますか? どうもありがとう!

4

2 に答える 2

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それらは同じであると言います。

于 2012-11-02T12:13:36.610 に答える
1

を使用して比較を行いたいとしますall.equal()。これにより、比較で多少のあいまいさが許容されます。==正確な同等性をテストするために as that を使用することはできません。これは、浮動小数点データに対して行うべきでも、行うべきでもありません。

> 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

リストと同様に、最後の 2 つはわずかに異なることに注意してくださいsequence1

于 2012-11-02T12:16:24.440 に答える