r-当出现双矢量错误时,是什么原因导致了case_which double vector error



我想创建一个新变量,指示一个人是在左边还是右边(如果他们的"y"值大于"a",他们在左边,如果他们的y值小于a,他们在右边(。我试过这个代码:

df <- df %>% 
mutate(Side = case_when(y > a ~ "Left", 
y < a ~ "Right",
y = a ~ "C"))

然而,当我尝试它时,我得到了这个错误:

Error: Problem with `mutate()` input `Side`.
x object 'y' not found
ℹ Input `Side` is `case_when(y > a ~ "Left", y < a ~ "Right", y = a ~ "C")`.

我很失落,因为a和y都是数值向量。知道为什么吗?

structure(list(y = c(26.85, 26.85, 26.85, 26.85, 26.85, 
26.85, 26.85, 26.85, 26.85, 26.85, 26.85, 26.85, 26.85, 26.85, 
26.85, 26.85, 26.85, 26.85, 26.85, 26.85), a = c(26.67, 36.47, 
44.16, 22.01, 36.15, 28.7, 26.63, 31.12, 20.53, 43.49, 21.83, 
26.59, 26.71, 26.85, 26.67, 36.47, 44.17, 22, 36.15, 28.7)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))
``

=是赋值,==是相等性的测试。更改为y == a ~ "C"

df %>% 
mutate(Side = case_when(y > a ~ "Left", 
y < a ~ "Right",
y == a ~ "C"))
# # A tibble: 20 x 3
#        y     a Side 
#    <dbl> <dbl> <chr>
#  1  26.8  26.7 Left 
#  2  26.8  36.5 Right
#  3  26.8  44.2 Right
#  4  26.8  22.0 Left 
#  5  26.8  36.2 Right
#  6  26.8  28.7 Right
#  7  26.8  26.6 Left 
#  8  26.8  31.1 Right
#  9  26.8  20.5 Left 
# 10  26.8  43.5 Right
# 11  26.8  21.8 Left 
# 12  26.8  26.6 Left 
# 13  26.8  26.7 Left 
# 14  26.8  26.8 C    
# 15  26.8  26.7 Left 
# 16  26.8  36.5 Right
# 17  26.8  44.2 Right
# 18  26.8  22   Left 
# 19  26.8  36.2 Right
# 20  26.8  28.7 Right

话虽如此。。。注意,浮点等式并不总是完美的。计算机在浮点数(也称为doublenumericfloat(方面有局限性。这是计算机处理非整数的基本限制。这并不是任何一种编程语言所特有的。有一些附加库或包在任意精度数学方面要好得多,但我相信大多数主流语言(我承认这是相对的/主观的(默认情况下都不使用这些。参考文献:为什么这些数字不相等?,浮点数学坏了吗?,和https://en.wikipedia.org/wiki/IEEE_754.

如果你发现自己处于这样一种情况:;知道";如果两个数字相同,但==返回FALSE,请考虑转换为绝对差的度量,可能类似于:

eps <- 1e-8
df %>% 
mutate(Side = case_when(y > a ~ "Left", 
y < a ~ "Right",
abs(y - a) < eps ~ "C"))

用于eps的实际值是特定于您的需求的;给定我们在df中看到的数据,那么1e-8可能就足够了。在其他数据中,寻找一个远小于预期范围,但仍比.Machine$double.eps大一个数量级或更大的值(约为2e-16(。

最新更新