【问题标题】:Subset does not work with some numeric values but with others子集不适用于某些数值,但适用于其他数值
【发布时间】:2020-01-24 21:50:44
【问题描述】:

我遇到了一个非常奇怪的问题,我不知道如何解决,也从未见过。我可以将data.frame 子集化为一些但不能用于其他数值。

这是我使用的数据:

library(dplyr)
ws <- seq(0, 1, by=.1)
kombos <- expand.grid(weightjaw2 = ws,
                  weightjaw3 = ws) %>% as.data.frame
kombos$kombi <- 1:nrow(kombos)
kombos$weightjaw2 <- as.numeric(kombos$weightjaw2)
kombos$weightjaw3 <- as.numeric(kombos$weightjaw3)
class(kombos$weightjaw2)

[1] "numeric"

现在,我需要对这个 data.frame 进行子集化。这很好用,例如值0.1

kombos %>% filter(weightjaw2==0.1)
   weightjaw2 weightjaw3 kombi
1         0.1        0.0     2
2         0.1        0.1    13
3         0.1        0.2    24
4         0.1        0.3    35
5         0.1        0.4    46
6         0.1        0.5    57
7         0.1        0.6    68
8         0.1        0.7    79
9         0.1        0.8    90
10        0.1        0.9   101
11        0.1        1.0   112

奇怪的是,这不适用于0.30.60.7 的值。

kombos %>% filter(weightjaw2==0.3)
[1] weightjaw2 weightjaw3 kombi     
<0 rows> (or 0-length row.names)

subset(kombos, weightjaw2==0.3) 也是如此。为什么会这样?我该如何解决?

编辑

我使用dyplyr::near()解决了这个问题:

kombos %>% filter(near(weightjaw2, 0.3))

【问题讨论】:

  • 这将是一个浮点问题您可以检查差异kombos$weightjaw2 - 0.3
  • 一个选项是在转换为character kombos %&gt;% filter(as.character(weightjaw2) == 0.3)filter

标签: r dplyr subset


【解决方案1】:

== 要求 lhs 和 rhs 完全相等。由于精度检查,“weightjaw2”列不完全等于 0.3。一种选择是将filter 中的列转换为character 以对行进行子集

library(dplyr)
kombos %>%
    filter(as.character(weightjaw2) == 0.3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多