我有以下内容
library(tidyverse)
test <- tibble(A = c("1994:2020, 2021"), B = 1995)
我想检查 B 中的年份是否在 A 列中给出的年份中。A 列中的年份是一个字符串(数据是从 Excel 文件中读取的)。以下显然不起作用(它给出“否”,但我想要“是”):
test %>%
mutate(InA = ifelse(B %in% A, "Yes", "No"))
> test
# A tibble: 1 x 2
A B
<chr> <dbl>
1 1994:2020, 2021 1995
我假设我必须分隔 A 中的字符串。但是,A 可以包含多个范围和/或超过一年(例如(“1994:2012, 2014, 2016:2020, 2021”)并使用“separate”对于不同的结构会变得复杂,也许有更简单的方法。
让我们再创建几个示例:
如果您相信您的输入,您可以对其进行评估。
基础R溶液
我就是这样做的。
tidyverse
解决方案当您加载
library(tidverse)
问题时,您还可以执行以下操作:A
请注意,如果包含非连续范围(例如 ),这两种方法也将起作用1994:2012, 2014
,但并非所有答案都会起作用。强制性免责声明
无论采用哪种方法,都值得阅读评估以字符串形式给出的表达式和eval(parse(...)) 的具体危险是什么?。如果您不控制输入数据,请勿使用此方法。想象一个包含这样的字符串的输入数据帧。
这两种方法都会执行代码并打印警告。因此,如果有可能,请使用不同的方法。
主意
如果你只需要知道一个点是否属于某个区间,那么你只需要知道该点与该区间的两条边之间的关系。
从数学上讲,给定一个点
p
和一个区间[lb, ub]
,当且仅当p
位于区间内(包括边缘),因此您可以尝试仅检查其符号。(p-lb)*(p-ub) <= 0
prod(p - c(lb,ub))
代码
您可以尝试下面的代码(另外,感谢@Roland提供的数据)
这使
对于大数据来说,这不会很快,但它可以工作:
我们首先将字符拆分为各个范围,然后拆分这些范围以获得它们的限制。与限制进行比较很容易,就像与单个年份(而不是范围)进行比较一样。
这是另一种选择如何做到这一点:
Tidyverse 相当于 @SamR 的策略
创建于 2024-03-08,使用reprex v2.0.2