2011-08-09 9 views
3

サブセット化に%in%を使用していますが、私は奇妙な結果に出くわしました。データフレームのサブセット化に関するヘルプ

> my.data[my.data$V3 %in% seq(200,210,.01),] 
     V1  V2  V3   V4  V5  V6   V7 
56  470 48.7 209.73  yes  26.3  54  470 

これは間違いありませんでした。しかし、私が範囲を広げると...行56だけが消える

> my.data[my.data$V3 %in% seq(150,210,.01),] 
     V1  V2  V3   V4  V5  V6   V7 
51  458 48.7 156.19  yes  28.2  58  458 
67  511 30.5 150.54  yes  26.1  86  511 
73  535 40.6 178.76  yes  29.5  73  535 

何が間違っているのか教えてもらえますか? データフレームをサブセット化するより良い方法はありますか?

は、ここでその構造

> str(my.data) 
'data.frame': 91 obs. of 7 variables: 
$ V1: Factor w/ 91 levels "100","10004",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ V2: num 44.6 22.3 30.4 38.6 15.2 18.3 16.3 12.2 36.7 12.2 ... 
$ V3: num 110.83 25.03 17.17 57.23 2.18 ... 
$ V4: Factor w/ 2 levels "no","yes": 1 2 2 2 1 1 1 1 1 1 ... 
$ V5: num 22.3 30.5 24.4 25.5 4.1 28.4 7.9 5.1 24 12.2 ... 
$ V6: int 50 137 80 66 27 155 48 42 65 100 ... 
$ V7: chr "" "10004" "10005" "10012" ... 
+0

「V3」が指定された範囲にあるすべての行を返そうとしているか、シーケンス番号と等しい行だけを返すかどうかを明確にすることはできますかあなたは返されることを意図しましたか? –

+0

V3が2桁の小数点以下に丸められているとすれば、 "V3が指定された範囲にあるすべての行"は "インクリメントが.01の数字のシーケンスと等しい行"と同じであると考えました。あなたの質問に答えるために、私は最初に – Brani

+0

V3が正確であるかもしれないが、私はすべての値を知っていません。問題は、 'seq()'の値が丸められていないということです。それが問題です。とにかく、正確に等しいかどうかをテストすることによって何かをすることは、浮動小数点演算を使ってコンピュータで失敗することになります。 Rで演算子よりも小さいものと大きいものを使う方がはるかに安全です/より簡単です/正解です。Answerまたは@nullglobによるAnswerの2番目のオプションを参照してください。 –

答えて

8

メールで送信されます。あなたは正確にすべての数字を表すことができないコンピュータで正確なマッチングをしようとしています。

> any(209.73 == seq(200,210,.01)) 
[1] TRUE 
> any(209.73 == seq(150,210,.01)) 
[1] FALSE 
> any(209.73 == zapsmall(seq(150,210,.01))) 
[1] TRUE 

不一致の理由は、シーケンス内の値は、正確209.73ないが、第二の配列です。これは、コンピュータで計算を行う際に気をつけなければならないことです。

これは、インターウェブ上の多くの場所でカバーされていますが、Rとの関連では、R FAQのpoint 7.31を参照してください。

とにかく、問題は間違っていると言われました。

my.data[my.data$V3 >= 150 & my.data$V3 <= 210, ] 
## or 
subset(my.data, V3 >= 150 & V3 <= 210) 
関連する問題