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(或其他矢量化)来完成吗?我怎么说"对于这个列表的每个元素,如果元素小于列表中的任何先前值,则将元素添加到新列表"?
您正在寻找:
unique(cummin(myList))
Run Code Online (Sandbox Code Playgroud)
列表中每个n的子集x [1:n - 1]的min是列表的累积最小值.由于cummin是矢量化的,结果具有相同的输入列表大小,因此我们需要unique删除deplicated.
相同的解决方案可以推广用于:
cummaxcumsumcumprod