我正在尝试编写一个函数,如果该列表元素小于列表中的任何先前值,则会将列表元素添加到另一个列表中。我有一个非矢量化的版本:
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(或其他矢量化)来完成吗?我如何说“对于此列表的每个元素,如果元素小于列表中的任何先前值,则将元素添加到新列表中”?
答案 0 :(得分:7)
您正在寻找:
unique(cummin(myList))
列表的每个n的子集x [1:n - 1]的 min是累积最小值
列表。由于cummin
是矢量化的,因此结果与输入列表的大小相同,因此我们需要unique
来删除deplicated。
可以推广相同的解决方案:
cummax
cumsum
cumprod