2017-12-05 2 views
1

월별 주식 수익률의 dataframe 있습니다계산 3 월 복귀

d<-data.frame(replicate(5,sample(rnorm(1),6,rep=TRUE))) 

가 지금은 N에 대한 (다음과 같은 방법으로 예를 N 개월 수익률 이러한 수익을 변환하고 싶습니다를 = 3) :

d[1,1]=(1+d[1,1])*(1+d[2,1])*(1+d[3,1]) 
d[2,1]=(1+d[2,1])*(1+d[3,1])*(1+d[4,1]) 
d[3,1]=(1+d[3,1])*(1+d[4,1])*(1+d[5,1]) 

그리고 그 다음 열의 같은

:

d[1,2]=(1+d[1,2])*(1+d[2,2])*(1+d[3,2]) 
d[2,2]=(1+d[2,2])*(1+d[3,2])*(1+d[4,2]) 
d[3,2]=(1+d[3,2])*(1+d[4,2])*(1+d[5,2]) 

나는 당신이 아이디어를 얻을 생각합니다. 재미는 다음과 같이 정의된다

apply(d, 2, fun) 

는 :

fun<-function(df_column) 
{ 
    # Loop over df_column rows 
for (row in 1:nrow(df_column)) { 
    d[row]=(1+d[row])*(1+d[row+1])*(1+d[row+2]) 
} 
} 

의미가이 방법 지나요 또는 더 우아한 방법이 다음과 같이

지금, 나는 계속 생각했던 방법은?

답변

2

rollapply을 선호하는 방식에 따라이 형식 중 하나로 시도하십시오. 첫 번째 행은 마지막 두 행에 NA를 둡니다. 두 번째 줄은 부분 곱으로 채우고 세 번째 줄은 마지막 두 줄을 떨어 뜨립니다. 3 인수는 롤링 제품의 너비를 지정하며 다른 너비를 시도하려는 경우 변경할 수 있습니다. 자세한 내용은 ?rollapply을 참조하십시오.

library(zoo) 

rollapplyr(d + 1, 3, prod, align = "left", fill = NA) 

rollapplyr(d + 1, 3, prod, align = "left", partial = TRUE) 

rollapplyr(d + 1, 3, prod, align = "left") 
+0

"zoo"에서 사용 된 기능을 보지 못했습니다. 나는 그것이 얼마나 쉬운지를 좋아합니다. 호기심에서 나는'map' 해결책보다 훨씬 느리다는 것을 알았고 그것이 왜 그런지 궁금했다. –

+2

이것은 동물원 객체를 대상으로하며 객체를 동물원으로 내부적으로 변환 한 다음 다시 변환하여 R로 작성합니다. 또한 매우 일반적입니다. 당신은'exp (rollsum (log (1 + d), 3, align = "left", fill = NA))'를 시도 할 수있다. 또한 C++로 작성된 롤링 함수가있는 RcppRoll 패키지도 있습니다. –

+0

우수, 팁 주셔서 감사합니다! –

1

purrr::map_dfdplyr::lead을 사용하면 내가 원하는 것을 얻을 수 있습니다.

library(dplyr) 
library(purrr) 

set.seed(42) 

df <- data.frame(replicate(5, rnorm(6))) 

df %>% 
    map_df(function(x) { 

    (1 + x) * (1 + lead(x, 1)) * (1 + lead(x, 2)) 

    }) 

# # A tibble: 6 x 5 
#   X1  X2   X3   X4   X5 
#  <dbl> <dbl>  <dbl>  <dbl>  <dbl> 
# 1 1.4068610 6.863243 -0.2430606 -2.3172461 1.2246900 
# 2 0.9688954 2.561324 1.0225645 -1.2568729 -0.3228241 
# 3 3.1256224 6.520767 1.0148172 -0.4485965 -0.8276191 
# 4 2.0496361 7.100212 -1.9395879 -1.4328679 -0.4011510 
# 5  NA  NA   NA   NA   NA 
# 6  NA  NA   NA   NA   NA 

N.B. 두 레코드를 앞두고 있으므로 마지막 두 행은 NA 만 생성합니다. 파이프를 제외하려면 na.omit 또는 tidyr::drop_na을 파이프에 추가 할 수 있습니다.

+0

매우 좋습니다. Kevin에게 감사드립니다 !! –