用R中的硬编码值进行数字匹配/提取

时间:2018-03-12 00:02:09

标签: r

无法理解R中的数字匹配/索引。

如果我有创建数据框的情况,例如:

options(digits = 3)
x <- seq(from = 0, to = 5, by = 0.10)
TestDF <- data.frame(x = x, y = dlnorm(x))

我希望将硬编码值与我的y列进行比较 -

> TestDF[TestDF$y == 0.0230,]$x
numeric(0)

话虽如此,如果我直接从数据帧中得到的值(对于x值为4.9,应该是y值0.0230)。

> TestDF[TestDF$y == TestDF[50,]$y,]$x
[1] 4.9

这与精确匹配有关吗?如果我将数字限制为3个小数点,那么0.0230000将不会与我所比较的原始值相同?如果是这种情况,如果我确实需要根据舍入的硬编码值提取值,是否可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以将四舍五入的y与所述值进行比较:

> any(TestDF$y == 0.0230)
[1] FALSE
> any(round(TestDF$y, 3) == 0.0230)
[1] TRUE

我不确定你是否了解digits选项的含义。来自?options它说的是digits

  

digits:控制打印数值时打印的有效位数。

(强调我的。)所以这只会影响打印的值,而不会影响它们的存储方式。

您生成了一组实数,其中没有一个是0.0230。这与精确匹配无关。您指定的值0.0230实际上应存储为

> with(TestDF, print(y[50], digits = 22))
[1] 0.02302883835550340041465

无论digits 中的options设置如何,因为该设置仅影响打印的值。问题不完全匹配,因为即使使用推荐的方式进行比较所允许的小软糖,all.equal()y[50]0.0230仍然不相等

> with(TestDF, all.equal(0.0230, y[50]))
[1] "Mean relative difference: 0.001253842"

答案 1 :(得分:1)

您可以使用round()函数将十进制数字的数量减少到浮点数的首选比例。见下文。

set.seed(1L)
x <- seq(from = 0, to = 5, by = 0.10)
TestDF <- data.frame(x = x, y = dlnorm(x))
constant <- 0.023
TestDF[ with(TestDF, round(y, 3) == constant), ]
#      x          y
# 50 4.9 0.02302884