帮助对数据框进行子集化

发布于 2024-11-28 13:31:57 字数 1160 浏览 0 评论 0原文

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

I am using %in% for subsetting and I came across a strange result.

> 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

That was correct. But when I widen the range... row 56 just disappears

> 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

Can you tell me what's wrong?
Is there a better way to subset the dataframe?

Here is its structure

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃兔兔 2024-12-05 13:31:57

哎呀。您正尝试在无法准确表示所有数字的计算机上进行精确匹配。

> 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 常见问题解答中的第 7.31 点

不管怎样,这就是说,你对这个问题的处理方式是错误的。您想使用正确的数字运算符:

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

Ooops. You are trying to do exact matching on a computer that can't represent all numbers exactly.

> 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

The reason for the discrepancy is in the second sequence, the value in the sequence is not exactly 209.73. This is something you have to appreciate when doing computation with computers.

This is covered in many places on the interweb, but in relation to R, see point 7.31 in the R FAQ.

Anyway, that said, you are going about the problem incorrectly. You want to use proper numeric operators:

my.data[my.data$V3 >= 150 & my.data$V3 <= 210, ]
## or
subset(my.data, V3 >= 150 & V3 <= 210)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文