无法理解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将不会与我所比较的原始值相同?如果是这种情况,如果我确实需要根据舍入的硬编码值提取值,是否可以解决这个问题?
答案 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