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)
糟糕!您正尝试在无法准确表示所有数字的计算机上进行精确匹配.
> 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)
归档时间: |
|
查看次数: |
570 次 |
最近记录: |