帮助对数据帧进行子集化

Bra*_*ani 3 r subset dataframe

我使用%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
Run Code Online (Sandbox Code Playgroud)

那是对的.但是当我扩大范围时......第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
Run Code Online (Sandbox Code Playgroud)

你能告诉我什么是错的吗?有没有更好的方法来对数据帧进行子集化?

这是它的结构

> 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" ...
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 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
Run Code Online (Sandbox Code Playgroud)

差异的原因在于第二个序列,序列中的值并不完全正确209.73.在使用计算机进行计算时,您必须要了解这一点.

这在interweb的许多地方都有涉及,但就R而言,请参阅R FAQ中的第7.31点.

不管怎么说,你说错了.您想使用正确的数字运算符:

my.data[my.data$V3 >= 150 & my.data$V3 <= 210, ]
## or
subset(my.data, V3 >= 150 & V3 <= 210)
Run Code Online (Sandbox Code Playgroud)