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

时间:2014-05-09 21:08:29

标签: r functional-programming 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)

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

1 个答案:

答案 0 :(得分:7)

您正在寻找:

unique(cummin(myList))

编辑一些解释:

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

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

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