如何解决我可以将 floor() 用于特定数字吗?
我想 floor()
到下一个特定数字(不是数字,而是实际值)。
例如。年份列表:
valid_years = c(1990,2000,2006,2012,2018) # values to round to ("snap")
input = c(1990,1991,1992,1993,2001,2002,2007,2016,2020)
output = c(1990,1990,2018)
以下输入的行为(或在 ceil()
以上的情况下)指定值对我来说并不重要。在我的情况下,一个好的行为是捕捉到 valid_years
中的最低值,但这对我来说并不重要。
我知道我可以使用 if-then-else(例如 if(x < 2006) x = 2000 else if(x < 2012) x = 2006 ...
)来实现这一点,但我相信有更优雅的方法来解决这个问题。
我浏览了许多“R 中的舍入”问题,但尽管有许多类似措辞的问题,但都没有找到答案,这些问题都有其独特的(不同的)目标:例如rounding to specific decimal-steps, rounding to arbitrary number within a range 或 conditional rounding。
解决方法
您可以使用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
,
你可以这样做
purrr::map_dbl(input,~ tail(valid_years[valid_years <= .x],1))
结果:
[1] 1990 1990 1990 1990 2000 2000 2000 2006 2006 2012 2018
,
对于带有函数的基本 R 解决方案(希望我评论得足够多):
nearest <- function(samples,value) {
# Return index of minimal absolute difference between samples and the value provided
which.min(abs(samples - value))
}
round_to_values <- function(desired,input) {
# Init the resulting vector to avoid growing within the loop
results = input
# Loop over the input values and fill result with the index of the nearest desired vector
for (i in seq(1,length(input))) {
results[i] = desired[nearest(desired,input[i])]
}
# return the results
results
}
# Effectively call the function witht the inputs
valid_years = c(1990,2000,2006,2012,2018) # values to round to ("snap")
input = c(1990,1991,1992,1993,2001,2002,2007,2016,2020)
round_to_values(valid_years,input)
结果是:
> round_to_values(valid_years,input)
[1] 1990 1990 1990 1990 2000 2000 2000 2006 2006 2018 2018
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。