【问题标题】:lapply from 1:n for each element of a list R对于列表 R 的每个元素,从 1:n 开始
【发布时间】:2014-06-27 17:55:31
【问题描述】:

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

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 来加快速度。问题是对于列表x 的每个元素n,我需要能够找到子集x[1:n - 1] 的最小值。这可以在 lapply (或以其他方式矢量化)中完成吗?如何说“对于此列表的每个元素,如果该元素小于列表中的任何先前值,则将该元素添加到新列表中”?

【问题讨论】:

    标签: r functional-programming vectorization apply lapply


    【解决方案1】:

    您正在寻找:

    unique(cummin(myList))
    

    编辑一些解释:

    列表中每个 n 的子集 x[1:n - 1] 的最小值累积最小值 名单。由于cummin是向量化的,结果与输入列表大小相同,所以我们需要unique去除deplicated。

    同样的解决方案可以推广到:

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

    【讨论】:

    • 男孩,这真的减少了浪费的时间!
    • 这真的很漂亮,谢谢。如果我需要应用除 min、max、sum 等以外的函数,是否有更通用的解决方案?
    • 这很有趣,但我想问你是否可以在可能的情况下为你的方法添加任何补充信息。
    • 只有三个部分,myListcummin(myList),和unique(cummin(myList))
    • @TomR 你可以在sapply(seq_along(x), function(i) min(x[1:i])) 中插入任意函数而不是min,但它会慢很多