我有以下数据:

library(tidyverse)

table <- tibble(
  points = 0:10,
  energy = c(0, 120, 240, 300, 380, 500, 600, 780, NA, NA, NA),
  cost = c(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0)
)

我正在try 编写一个函数,该函数将一个值作为参数,对照energy中的值进行测量,然后返回关联的points值.

到目前为止,我可以理解一个基本的机制来提取它,大致如下:

energy_points <- function(energy_input) {
table_one %>%
  filter(energy == energy_input) %>%
  pull(points)
}

然而,我的函数的预期操作是,在分配分数之前,它查看Energy_input值并判断它属于哪个"范围".

因此,值125大于120且小于241,则返回点数1.值120不大于120,因此返回点数0.一些更多的预期输出如果有帮助的话:

energy_input points
50 0
120 0
121 1
240 1
241 2

How can I write the function so it checks ranges based on values in the table?

推荐答案

您可以按输入energy的最后一个元素(<;)进行索引:

energy_points <- function(energy_input) {
  # assumes `table` is sorted in ascending order by `energy`
  with(
    table, 
    points[[max(which(energy < energy_input))]]
  )
}

# test
input <- c(50, 120, 121, 240, 241, 780, 781)

data.frame(input, output = sapply(input, energy_points))
#   input output
# 1    50      0
# 2   120      0
# 3   121      1
# 4   240      1
# 5   241      2
# 6   780      6
# 7   781      7

或者,对于与您最初的方法类似的整齐解决方案:

library(dplyr)

energy_points <- function(energy_input) {
  table %>%
    filter(energy < energy_input) %>%
    slice_max(energy) %>%
    pull(points)
}

R相关问答推荐

将Multilinetring合并到一个线串中,使用sf生成规则间隔的点

在ggplot Likert条中添加水平线

检测(并替换)字符串中的数学符号

寻找图片边缘

从有序数据中随机抽样

基于不同组的列的相关性

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

gt()从gt为相同内容的单元格 colored颜色 不同?

根据模式将一列拆分为多列,并在R中进行拆分

使用gcuminc,如何使用逗号格式化风险表?

如何将移除事件分配给动态创建的按钮?

如何直接从R中的风险分数计算c指数?

`lazy_dt`不支持`dplyr/across`?

使用R中的dist()迭代ID匹配的欧几里德距离

R中Gamma回归模型均方误差的两种计算方法不一致

如何在ggplot2中创建多个y轴(每个变量一个)

为什么我对圆周率图的蒙特卡罗估计是空的?

如何在GALT包的函数&geom_x样条线中调整线宽

从单个html段落中提取键-值对

如何在R曲线图弹出窗口中更改r和theta标签