2014-09-29 3 views
0

다른 목록의 인덱스 위치를 기반으로 xts 오브젝트 목록에서 값 범위를 추출하려고합니다. 이제는 당신이 일반적인 생각을 가졌으므로 좀 더 구체적으로 생각해보십시오.불규칙한 요소 길이리스트에 for 루프를 적용 (또는 대체 적용)

  1. 첫번째 데이터
  2. 제 i가 첫 번째 목록 데이터를 추출하고자하는 숫자 인덱스 값의 벡터를 가지고 여러 XTS 개체를 포함

    I는 두 개의리스트가있다. 도움이된다면,이 지표 값은 시계열의 최대/최소를 나타냅니다. 따라서, 각 벡터의 길이는 각 시계열이 최대/최소치의 변화하는 양을 가질 때 균일하지 않다. 이제

, 내가 인덱스 값의 숫자 벡터의 길이를 알고 주어진,이 같은 값의 범위를 추출하는 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]) 
    

이 문제를 도와 줄 수있는 적용 제품군의 또 다른 기능이 있습니까? 고맙습니다!

+0

나는 headeack 당신이해야 할 노력을 이해하기 위해 노력하고 있습니다! 나는 꽤 당신이'mapply (function (l, i) l [i], ts_list, index_list)와 같은 것을 찾고 있다고 확신한다. ' – agstudy

+0

haha ​​sorry agstudy! 당신은 확실히 바른 길 위에 있고, mapply와 함께 나에게 큰 팁을 줬다. 나는 그것이 명확하지 않다고 생각하지만 도움이된다면 "확률"은 내가 수집하기를 원하는 범위의 시작이고 "evens"는 멈춤이다. 난 그냥 데이터 범위를 추출하여 mapply 함수를 수정해야 할 것 같아요. 고맙습니다! – jonnie

+0

나는 함수를 편집했지만 "숫자 식은 1009 개의 요소가 있습니다. 첫 번째 사용 만"이라는 경고 메시지가 나타나서 제게 제공 한 출력은 정확하지만 첫 번째 요소 만 제공됩니다. 나는 각 벡터 요소를 통과 할 수 있는지보기 위해 rapply를 시도 할 것입니다. – jonnie

답변

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) 
+1

oh man. 고맙습니다 – jonnie