2012-08-18 2 views
2

내가 할 수있는 기능은 다음 값으로 XTS 개체 (데이터)를 말한다 객체에몇 가지 조건이 충족되는 경우 내가 그것을 신호를 추가하는 기능을 적용 사용하려고 해요 ... XTS는

  SPY.Adjusted  SMA 
2012-08-02  136.64 137.115 
2012-08-03  139.35 137.995 
2012-08-06  139.62 139.485 
2012-08-07  140.32 139.970 
2012-08-08  140.49 140.405 
2012-08-09  140.61 140.550 
2012-08-10  140.84 140.725 

을 기능 적용 ...이 경우 SMA 닫기>. 내 기능 : 반환 오류와

signal<-function(x,y,z) 
    { 
    z$signals<-ifelse(x>y,1,0) 
    } 

내가하려고 ...

apply(data,1,FUN=signal(data$SPY.Adjusted,data$SMA,data)) 

는 :

Error in match.fun(FUN) : 'signal(data$SPY.Adjusted, data$SMA, data)' 
    is not a function, character or symbol 

가능성이 뭐가 잘못 이죠? 특정 조건이 충족되면 새로운 열을 만들기 위해 전달 된 데이터에 전달되는 함수에 전달되었습니다.

답변

4

MARGIN=1으로 전화를 걸면 각 행을 FUN으로 전달하는 것과 같습니다. 함수가 이미 벡터화되어 있으므로 apply을 사용할 필요가 없습니다. 그러나 함수는 아무 것도 반환하지 않습니다.

library(quantmod) 
getSymbols("SPY", src='yahoo', from='2010-01-01', to='2012-01-01') 
dat <- cbind(Ad(SPY), SMA=SMA(Ad(SPY))) 
signal<-function(x,y,z) 
{ 
    z$signals<-ifelse(x>y,1,0) 
    z 
} 

tail(signal(dat[, 1], dat[, 2], dat)) 
#   SPY.Adjusted  SMA signals 
#2011-12-22  124.08 121.693  1 
#2011-12-23  125.19 121.805  1 
#2011-12-27  125.29 122.108  1 
#2011-12-28  123.64 122.361  1 
#2011-12-29  124.92 122.871  1 
#2011-12-30  124.31 123.276  1 

는 사실, 내가이 GSEE의 answer 주소 @

signal<-function(x,y,z) 
{ 
    z$signals <- 0 
    z$signals[x > y] <- 1 
    z 
} 
+0

덕분에 너무 많은. – user1234440

2

실제 질문을하는 것보다 속도가 느린 있기 때문에 이런 상황에서 ifelse을 피하기 위해 노력하지만, 나는이 많은 것으로 발견이 시도 직접적인 :

dat$signal = (dat[,1] > dat[,2]) + 0 

파트 (dat[,1] > dat[,2])TRUE 및,991,321의 벡터를 생성 0으로 설정하면 0을 입력하면 FALSE의 경우 0으로 변환되고 TRUE의 경우 1로 변환됩니다.

(dat,이 예에서, GSEE의 dat @ 동일합니다.) 물론

, 당신은 또한 하나 개 이상의 조건에 맞게이를 사용할 수 있습니다

set.seed(1) 
dat$SAMPLE = sample(as.vector(c(dat$SPY.Adjusted, dat$SMA)), nrow(dat)) 
dat$signal = (dat$SPY.Adjusted > dat$SMA & dat$SPY.Adjusted > dat$SAMPLE) + 0 
tail(dat, 15) 
#   SPY.Adjusted  SMA SAMPLE signal 
# 2011-12-09  124.07 122.421 125.990  0 
# 2011-12-12  122.26 122.864 124.260  0 
# 2011-12-13  121.11 123.159 128.350  0 
# 2011-12-14  119.82 122.839 114.966  0 
# 2011-12-15  120.26 122.565 128.490  0 
# 2011-12-16  120.44 122.320 126.486  0 
# 2011-12-19  119.15 121.812 128.598  0 
# 2011-12-20  122.75 121.660 127.605  0 
# 2011-12-21  122.99 121.485 119.150  1 
# 2011-12-22  124.08 121.693 116.030  1 
# 2011-12-23  125.19 121.805 104.870  1 
# 2011-12-27  125.29 122.108 116.460  1 
# 2011-12-28  123.64 122.361 126.127  0 
# 2011-12-29  124.92 122.871 119.750  1 
# 2011-12-30  124.31 123.276 104.110  1 
+0

중괄호 안에 여러 조건을 중첩 할 수 있습니까? 예를 들어, 두 개의 표시기가 필요한 경우 ... $ signal = (a> b 및 a> c) + 0 – user1234440

+0

@Tom, 업데이트 된 답변을 참조하십시오. – A5C1D2H2I1M1N2O1R2T1

관련 문제