帮助对数据帧进行子集化

时间:2011-08-09 14:58:32

标签: r dataframe subset

我使用%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" ...

1 个答案:

答案 0 :(得分: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常见问题解答中的point 7.31

无论如何,那说,你正在解决这个问题。您想使用正确的数字运算符:

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