我可以将 floor() 用于特定数字吗?

Hon*_*ear 0 r rounding floor

我想要floor()下一个特定数字(不是数字,而是实际值)。例如,对于年份列表:

valid_years = c(1990,2000,2006,2012,2018) # values to round to ("snap")

input  = c(1990, 1991, 1992, 1993, 2000, 2001, 2002, 2006, 2007, 2016, 2020)
output = c(1990, 1990, 1990, 1990, 2000, 2000, 2000, 2006, 2006, 2012, 2018)
Run Code Online (Sandbox Code Playgroud)

低于(或在ceil()高于指定值的情况下)输入的行为对我来说并不重要。在我的情况下,一个好的行为是捕捉到 中的最低值valid_years,但这对我来说并不重要。

我知道我可以用 if-then-else (eg if(x < 2006) x = 2000 else if(x < 2012) x = 2006 ...)来实现这一点,但我相信有更优雅的方法来解决这个问题。

我浏览了许多“R 中的舍入”问题,但尽管有许多措辞相似的问题,但都没有找到答案,这些问题都有其独特的(不同)目标:例如,四舍五入到特定的小数步长四舍五入到某个范围内的任意数字条件舍入

r2e*_*ans 5

您可以使用findInterval

valid_years[findInterval(input, valid_years)]
#  [1] 1990 1990 1990 1990 2000 2000 2000 2006 2006 2012 2018
all(valid_years[findInterval(input, valid_years)] == output)
#  [1] TRUE
Run Code Online (Sandbox Code Playgroud)