我希望根据另一个列表中的索引位置从xts对象列表中提取一系列值。既然你有了一般的想法,请允许我更具体。
我有两个清单:
现在,鉴于我知道索引值的数字向量的长度,我可以构造一个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)
以下是我尝试过的内容,但我仍然坚持最大/最小值索引值的长度变化的事实:
双循环
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]]
}
}
我尝试创建一个包含整个值范围的新字符串列表,这样我只需循环遍历这些名称......如下所示:
split.xts[[1]][paste(odd.list[[1]][6],even.list[[1]][6],sep=":")]
lapply,但老实说,我并不感到自豪。
lapply(split.xts, function(x) x[odd.list:even.list])
申请家庭中是否有其他功能可以帮助我解决这个问题?谢谢!
答案 0 :(得分:2)
当您想要以对称方式使用参数向量化函数时,使用mapply
或Map
是可行的方法。
所以这样的事情:
## 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)