假设我有一个向量v=c(10,3,5,1,12,7,9,2).对于每个值,我想找到"下一个更高"之前的步数,即下一个高于当前值的值.

例如,第一个值是10,下一个更高的值是12,12是从10中删除的4个步骤.所以第一个元素与4相关联.接下来,我们有一个3,后面是5:只有1步,直到下一个更高的值.因此,最终结果应该是c(4,1,2,1,NA,1,NA,NA),只要没有"下一个更高"的值,就插入NA:12永远不会被打败,最后的2和之前的9都不会被打败.

我可以通过"for"循环来实现:

v=c(10,3,5,1,12,7,9,2)
# stop 1 step before the last
n=length(v)-1
#initialize vector
next_higher=vector()
for (i in 1:n) {
  # check if the next higher exists: the vector of higher values is non-empty
  if (length(which(v[(i+1):(n+1)]>v[i]))==0) {
    # if not, insert NA
    next_higher=c(next_higher,NA_real_)
  } else {
    # else, get the index and move on
    next_higher=c(next_higher,which(v[(i+1):(n+1)]>v[i])[1])
  }
}
# the last one is always going to be NA
next_higher=c(next_higher,NA)

但这是出了名的低效和不雅.

我还try 了一个递归函数:

find_next_higher = function (x) {
  # recursive function
  ifelse(length(x)==1,
         # if length is 1 there's no next higher
         return(NA_real_),
         # else check if there is a next higher
         ifelse(length(which(x[-1]>x[1]))==0,
                # if it doesn't exist, return NA and concatenate, removing the first element
                return(c(NA_real_,find_next_higher(x[-1]))),
                # if it does, find index and concatenate, removing the first element
                return(c(which(x[-1]>x[1])[1],find_next_higher(x[-1])))
                )
         )
}

但我有一个深层递归问题,它不适用于大向量.

最干净的方法是什么?

我考虑过apply函数族,或purrr库,但没有找到一种方法来处理剩余的v[(n+1):length(v)]子向量,而不是单独处理每个值.

提前感谢您的建议.

推荐答案

我们可以循环向量(sapply)的序列,通过使用which与当前元素(v[i])进行比较,得到"v"子集的第一个元素的位置索引,对第一个位置([1])进行子集划分并返回索引.

sapply(seq_along(v), \(i) which(v[-(seq_len(i))] > v[i])[1])
[1]  4  1  2  1 NA  1 NA NA

\(i)R最新版本中lambda表达式的一个紧凑选项.如果我们有旧的R版本,请按照News 4.1.0中的通知使用function(i)

R现在提供了创建函数的简写符号,例如(x)x+1被解析为函数(x)x+1.

sapply(seq_along(v), function(i) which(v[-(seq_len(i))] > v[i])[1])

R相关问答推荐

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

随机森林回归:下拉列重要性

如何从当前行上方找到符合特定条件的最接近值?

如何编辑ggplot的图例字使用自定义对象(gtable)?'

R根据条件进行累积更改

以更少间隔的较小表中的聚合离散频率表

使用Facet_WRAP时更改框图中线的 colored颜色

R Read.table函数无法对制表符分隔的数据正常工作

如何在PackageStatus()中列出&q;不可用的包&q;?

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

Data.table';S GForce-将多个函数应用于多列(带可选参数)

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

将标识符赋给事件序列,避免错误观察

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

使用列中的值来调用函数调用中应使用的其他列

为R中的16组参数生成10000个样本的有效方法是什么?

R仅当存在列时才发生变异

R-找出存在其他变量的各种大小的所有组合

如何在R中创建这些列?

R,将组ID分配给另一个观测ID变量中的值的组合