在不均匀元素长度列表中应用for循环(或应用替换)

时间:2014-09-29 17:49:09

标签: r indexing apply xts lapply

我希望根据另一个列表中的索引位置从xts对象列表中提取一系列值。既然你有了一般的想法,请允许我更具体。

我有两个清单:

  1. 第一个包含几个带数据的xts对象
  2. 第二个包含数字索引值的向量,我想从第一个列表中提取数据。如果有帮助,这些索引值表示时间序列的最大值/最小值。因此,每个矢量的长度不均匀,因为每个时间序列具有不同的最大值/最小值。
  3. 现在,鉴于我知道索引值的数字向量的长度,我可以构造一个for循环来提取一系列值,如下所示:

    # simple example ----------------------------------------------------------
    s <- Sys.Date()-11
    e <- Sys.Date()
    
    # xts list
    obj.xts <- xts(seq(.01,.12,by=.01),seq(from=s, to=e, by=1))
    evens <- c(2,4,6,8,10,12)
    odds <- evens-1
    
    mylist <- list()
    for(i in 1:length(evens)){
       mylist[[i]] <- obj.xts[odds[i]:evens[i]]  
    }
    

    但是,我目前的问题看起来更像是这样:

    # still need a solution ---------------------------------------------------
    even.list <- list(evens,evens[4])
    odd.list <- list(odds,odds[4])
    
    obj.xts2 <- xts(cbind(obj.xts,rev(obj.xts)),index(obj.xts))
    split.xts <- list(obj.xts2[,1],obj.xts2[,2])
    
    # desired output, first list element
    out1 <- split.xts[[1]][odd.list[[1]][1]:even.list[[1]][1]]
    out2 <- split.xts[[1]][odd.list[[1]][2]:even.list[[1]][2]]
    out3 <- split.xts[[1]][odd.list[[1]][3]:even.list[[1]][3]]
    out4 <- split.xts[[1]][odd.list[[1]][4]:even.list[[1]][4]]
    out5 <- split.xts[[1]][odd.list[[1]][5]:even.list[[1]][5]]
    out6 <- split.xts[[1]][odd.list[[1]][6]:even.list[[1]][6]]
    
    # from list element 2
    out7 <- split.xts[[2]][odd.list[[2]][1]:even.list[[2]][1]]
    
    
    # FINAL OUTPUT
    desiredOutput <- list(out1,out2,out3,out4,out5,out6,out7)
    

    以下是我尝试过的内容,但我仍然坚持最大/最小值索引值的长度变化的事实:

    1. 双循环

      mylist2 <- list()
      for(i in 1:??){
        for(j in 1:length(split.xts)){
          mylist2[[i]] <- split.xts[[j]][odd.list[[j]][i]:even.list[[j]][i]]
        }
      }
      
    2. 我尝试创建一个包含整个值范围的新字符串列表,这样我只需循环遍历这些名称......如下所示:

       split.xts[[1]][paste(odd.list[[1]][6],even.list[[1]][6],sep=":")]
      
    3. lapply,但老实说,我并不感到自豪。

      lapply(split.xts, function(x) x[odd.list:even.list])
      
    4. 申请家庭中是否有其他功能可以帮助我解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:2)

当您想要以对称方式使用参数向量化函数时,使用mapplyMap是可行的方法。

所以这样的事情:

## function subset an xts object giving a min/max lists
min_max_subset <- function(l,min_list,max_list)
  Map(function(x,y)l[seq(x,y)],min_list,max_list)
## Vectorized version of the previous function 
Map(min_max_subset ,split.xts,odd.list,  even.list)