对于列表R的每个元素,从1:n开始提供

Tom*_*omR 1 functional-programming r vectorization apply lapply

我正在尝试编写一个函数,如果列表元素小于列表中的任何先前值,则会将列表元素添加到另一个列表中.我有一个非矢量化的版本:

myList <- c(14, 35, 12, 54, 67, 8, 32, 3, 78)

minVec <- function(x){
# Return a list of all numbers from x which are less than any previous number in the list
  outList <- list(x[1])
  for(i in 2:length(x)){
    if(x[i] < min(x[1:i - 1])){
      outList <- c(outList, x[i])}
  }
  return(unlist(outList))
}

minVec(myList)
Run Code Online (Sandbox Code Playgroud)

但我需要在很多列表上多次这样做,我想用lapply加速它.问题是,对于n列表的每个元素,x我需要能够找到子集的min x[1:n - 1].这可以用lapply(或其他矢量化)来完成吗?我怎么说"对于这个列表的每个元素,如果元素小于列表中的任何先前值,则将元素添加到新列表"?

ags*_*udy 7

您正在寻找:

unique(cummin(myList))
Run Code Online (Sandbox Code Playgroud)

编辑一些解释:

列表中每个n的子集x [1:n - 1]min是列表累积最小值.由于cummin是矢量化的,结果具有相同的输入列表大小,因此我们需要unique删除deplicated.

相同的解决方案可以推广用于:

  • 累积最大值: cummax
  • 累计金额: cumsum
  • 累积产品: cumprod