r语言 - 找到向量中下一个更高的值之前的值的个数



假设我有一个向量v=c(10,3,5,1,12,7,9,2)。对于每个值,我想找出到"下一个更高"的步数,也就是下一个比当前值更好的值。

例如,第一个值是10,下一个更高的值是12,而12距离10有4步。所以第一个元素和4有关。接下来,我们有一个3,后面跟着5:距离下一个更高的值只有一步。因此,最终结果应该是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)

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

我还尝试了一个递归函数:

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)]子向量。

提前感谢您的建议。

我们可以遍历vector (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

R的最新版本中,(i)是lambda表达式的紧凑选项。如果我们有较旧的R版本,请使用News 4.1.0中通知的function(i)

R现在为创建函数提供了一种速记表示法,例如(x) x + 1被解析为function(x) x + 1。

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

相关内容

  • 没有找到相关文章

最新更新