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

如何解决我可以将 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-stepsrounding to arbitrary number within a rangeconditional 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?