我想创建一个新变量,指示一个人是在左边还是右边(如果他们的"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
话虽如此。。。注意,浮点等式并不总是完美的。计算机在浮点数(也称为double
、numeric
、float
(方面有局限性。这是计算机处理非整数的基本限制。这并不是任何一种编程语言所特有的。有一些附加库或包在任意精度数学方面要好得多,但我相信大多数主流语言(我承认这是相对的/主观的(默认情况下都不使用这些。参考文献:为什么这些数字不相等?,浮点数学坏了吗?,和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
(。