2014-01-27 2 views
0

데이터 프레임을 함수로 보내고, 목표는 S.COLOR이라는 빨간색/녹색 결과를 포함하는 다른 열을 추가하는 것입니다. 이것은 해가 수익성이 있는지 아닌지를 확인함으로써 이루어집니다 (수익성이란 Adj.의 12 월 31 일 종가 마감이 Adj.Close가 같은 해 1 월 1 일에 더 많음을 의미).함수에 데이터 프레임 보내기; 최소/최대 오류 결과

제 (헤드) 데이터 프레임은 다음과 같습니다

Date   Adj.Close YEAR 
1 2014-01-24  30.45  2014 
2 2014-01-23  31.48  2014 
3 2014-01-22  32.29  2014 
4 2014-01-21  32.63  2014 
5 2014-01-17  33.40  2014 
6 2014-01-16  32.00  2014 

. . .

내 기능은 다음과 같습니다

stock.color<-function(df) 
{ 
    my.year<-df$YEAR 

    #print(my.year) <--- this is OK it's a vector 
    dfsub<-subset(df,YEAR==my.year) 

    #print(dfsub) <--- this is OK it's a vector 

    minDate<-min(dfsub$Date) #<---problem here everything is the same date 1993-01-01 
    maxDate<-max(dfsub$Date) 

    print(minDate) 

    s<-subset(dfsub, Date==minDate) 
    e<-subset(dfsub, Date==maxDate) 

    amount.s<-s[,c("Adj.Close")] 
    amount.e<-e[,c("Adj.Close")] 

    if (amount.e>amount.s) 
    return ('GREEN') 
    return ('RED') 
} 

전송 기능 예 :

stock.data<-transform(stock.data, S.COLOR=stock.color(stock.data)) 

나는 최소/최대 기능은 같은 이산 결과를 반환하고 1993 점이다이 문제 -01-01 및 1993-31-12로 변경되어 새로운 열의 최종 결과가 올바르지 않습니다.

질문 : 왜 MIN/MAX에서 동일한 결과가 발생하며 어떻게 해결할 수 있습니까?

답변

1

YEAR==my.yeardf의 모든 값에 대해 TRUE이므로 모든 하위 집합을 지정하지 않습니다. transform은 자체적으로 "split-apply-combine"를 수행하지 않습니다. plyr 또는 data.table 또는 일부를 사용해야합니다. 여기 data.table 예 안된 :

library(data.table) 
dt <- data.table(stock.data) 
dt[ 
    order(Date), 
    S.COLOR:=if(head(Adj.Close, 1) < tail(Adj.Close, 1)) "GREEN" else "RED", 
    by=YEAR 
] 
dt 

ddply 버전 :

library(plyr) 
ddply(
    stock.data[order(stock.data$Date), ], 
    "YEAR", 
    transform, 
    S.COLOR=if(head(Adj.Close, 1) < tail(Adj.Close, 1)) "GREEN" else "RED" 
)