Помощь по подстановке данных - PullRequest
3 голосов
/ 09 августа 2011

Я использую% в% для поднабора, и я натолкнулся на странный результат.

> 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" ...

1 Ответ

8 голосов
/ 09 августа 2011

по электронной почте Ой. Вы пытаетесь выполнить точное сопоставление на компьютере, который не может точно представить все числа.

> 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 см. пункт 7.31 в R FAQ.

Во всяком случае, тем не менее, вы говорите о проблеме неправильно. Вы хотите использовать правильные числовые операторы:

my.data[my.data$V3 >= 150 & my.data$V3 <= 210, ]
## or
subset(my.data, V3 >= 150 & V3 <= 210)
...