2013-04-11 3 views
1

나는 100 개 이상의 주식에 대한 10 년 전의 정보가있는 주식 데이터 프레임을 가지고 있습니다. 이 데이터에 대한 quantmod에서 MACD 함수를 실행하려고하지만 다른 주식으로 계산을 분할하는 방법을 알 수 없습니다. 예를 들어 내 데이터 프레임의 약간은 다음과 같습니다 : 그것은 별도로 각 시장을 계산하기 위해 오는 동안 나는 MACD 기능에이 데이터 프레임을 전달하려면 어떻게요인으로 나누어 함수 적용하기

data<-structure(list(market = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L), .Label = c("AD1", "AD2", "AD3"), class = "factor"), 
date = structure(c(15623, 15624, 15625, 15628, 15623, 15624, 
15625, 15628, 15625, 15628), class = "Date"), open = c(101.52, 
101.68, 102.1, 101.99, 100.73, 100.85, 101.57, 101.01, 100.56, 
100.42), high = c(102.07, 102.39, 102.36, 102.07, 101.4, 
101.59, 101.62, 101.35, 100.56, 100.71), low = c(101.26, 
101.56, 101.63, 101.5, 100.59, 100.85, 101.07, 100.97, 100.56, 
100.41), last = c(101.78, 102.08, 101.76, 101.91, 101.08, 
101.37, 101.06, 101.21, 100.41, 100.56)), .Names = c("market", 
"date", "open", "high", "low", "last"), row.names = c(1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 11L, 12L), class = "data.frame", na.action = structure(9:10,.Names = c("9", 
"10"), class = "omit")) 

합니다. 도와 주셔서 감사합니다. 나는 R을 처음 사용했습니다

+0

이 시작하기에 좋은 장소입니다 : http://stackoverflow.com/questions/3505701/r-grouping-functions-sapply-vs-lapply-vs-apply-vs-tapply-vs-by- vs-aggrega – harkmug

답변

2

당신은 market에 의해 그룹에 여기 by를 사용하여 각 그룹에 기능을 적용 할 수 있습니다.

library(quantmod) 
by(data,data$market,function(x) 
{ 
    ## coerece the group to an xts object 
    dat.xts <- xts(x[,-c(1:2)],x$date) 
    ## EMA ~ MACD with type 'EMA' 
    EMA(dat.xts,n=min(nrow(dat.xts),10)) 

}) 

data$market: AD1 
       [,1] 
2012-10-10  NA 
2012-10-11  NA 
2012-10-12  NA 
2012-10-15 101.8225 
--------------------------------------------------------------------------------------------------------------- 
data$market: AD2 
      [,1] 
2012-10-10  NA 
2012-10-11  NA 
2012-10-12  NA 
2012-10-15 101.04 
--------------------------------------------------------------------------------------------------------------- 
data$market: AD3 
      [,1] 
2012-10-12  NA 
2012-10-15 100.49 
+0

이것은 13-26 일 이동 평균 간의 차이가 아닌 EMA 만 반환합니다. – Tim

+0

@Tim'MACD'는 내부적으로'EMA'를 호출합니다. 나는 네 입장을 모르겠다. – agstudy

0

MACD 의 기능은 xts이 아닌 data.frame입니다.

그래서 당신은 market에 의해 data.frame을 분할 첫째하면된다 다음 xts에 결과 data.frame 각각의 변환 후 macd 기능을 적용 할 필요.

LL <- split(data, data$market) 

result <- lapply(LL, 
     function(DF) { 
      XTS <- xts(DF[, -2], order.by = as.POSIXct(DF$date, format="%Y-%m-%d", tz="GMT"),tzone='GMT') 
      return(MACD(XTS$last))     
     } 
    ) 
+0

이유는 "rowSums (x) 오류 :"x '는 숫자 여야합니다. "오류 – Tim

관련 문제