2010-11-19 4 views
4
에 병합

두 개의 데이터 프레임이 있습니다. 같은이두 개의 다른 데이터 프레임을 R

Date   Price  Vol 
2008-09-01 20   0.2 
2008-09-01 30   0.5 
... 

을 보이는 한 세 가지 변수, 즉 "날짜", 20 명 관찰 일에 "파업"과 "권"으로 구성되어, 한 달에 100 1200 (매매 일) 년, 따라서 매달마다 가격과 가격에 대해 특정 값을 가지며 각각 10에서 40, 0.1에서 0.7 사이입니다.
두 번째 것은 첫 번째 보간 값을 포함합니다. 그래서 다른 변수 그러나 작은 단계, 더 이상 날짜가없는 : 그래서

Price  Vol 
    20   0.2 
    21   0.21 
    22   0.24 
    30   0.5 

을, 하나의 프레임은 이산 시간에 값을 표시하면서, 다른 하나는 더 또는 연속 성격의 적습니다.
이제 내 질문 : 두 번째 데이터 프레임을 첫 번째 데이터 프레임에 병합하여 두 개의 개별 가격 사이의 연속 가격/볼륨에 대한 날짜를 인수하여 다음과 같이 표시하는 방법은 무엇입니까?

Date   Price  Vol 
2008-09-01 20   0.2 
2008-09-01 21   0.21 
2008-09-01 22   0.24 
... 
2008-09-01 30   0.5 

나는 어떻게하는지 알 수 없다. 나는 더 이상 오름차순이 아닌 날짜에 대해 항상 NA 값으로 끝났다.

는 지원
다니

+0

원치 않는 결과를주는 코드를 추가하고 데이터 구조를 알려주십시오. POSIXlt, Data, chron, character, ...의 날짜인가? 예를 들면. –

답변

2

내가 완전히 첫 번째 게시물로 포인트를 놓쳤다. 이 사람은 데이트를합니다. 그러나 하향식 함수가 데이터 프레임을 필요로하지 않는 한, 시계열은 좋은 생각입니다.

A <- data.frame(date=rep("2001-05-25", 2), price=c(20, 30), vol=c(0.2, 0.5)) 
B <- data.frame(price=seq(min(A$price), max(A$price), by=1)) 
C <- merge(A, B, all=TRUE) 
index <- which(!is.na(C$vol)) 
for (i in seq(nrow(A))[-1]) { 
    C$date[index[i-1]:index[i]] <- rep(A$date[i-1], A$price[i] - A$price[i-1] + 1) 
    C$vol[index[i-1]:index[i]] <- seq(A$vol[i-1], A$vol[i], length=(A$price[i] - A$price[i-1] + 1)) 
} 
ans <- C[, c(2, 1, 3)] 

ans 
     date price vol 
1 2001-05-25 20 0.20 
2 2001-05-25 21 0.23 
3 2001-05-25 22 0.26 
4 2001-05-25 23 0.29 
5 2001-05-25 24 0.32 
6 2001-05-25 25 0.35 
7 2001-05-25 26 0.38 
8 2001-05-25 27 0.41 
9 2001-05-25 28 0.44 
10 2001-05-25 29 0.47 
11 2001-05-25 30 0.50 
4

먼저 주셔서 대단히 감사합니다 시계열 클래스 (예를 들어, zoo 또는 xts)를 사용합니다.

두 번째 보간 된 시계열은 시간별 또는 분간 등의 경우에도 여전히 시간 소인이 있어야합니다. merge을 사용하여 함께 가져온 다음 na.locf을 사용하여 낮은 빈도 시계열에서 값을 전달합니다.

다음은 예입니다 :

ts1 <- zoo(1:5, as.POSIXct(as.Date("2010-10-01") + 1:5)) 
ts2 <- zoo(1:(5 * 24), as.POSIXct("2010-10-01 00:00:00") + (1:(5 * 24) * 3600)) 
na.locf(merge(ts1, ts2)) 
+1

이것이 잘못된 질문에 대한 올바른 해결책이라고 생각됩니다. 당신은 시계열이 필요하지 않습니다. 첫 번째 데이터 프레임의 값부터 시작하여 두 번째 데이터 프레임에 걸쳐 레벨을 분산시켜야하는 요인으로 날짜를 참조하십시오. 해결책을 찾기가 너무 쉽지 않지만 이미 여기에서 해결되었습니다. –

+2

@Joris 나는 뭔가를 놓칠지도 모른다. 그러나 나는 나의 본보기가 그가 원하는 것을한다고 생각한다. 그렇습니다. 시계열은 필요하지 않지만 유용합니다. – Shane

+1

시작 지점이 올바르지 않습니다. ts1은 zoo (seq (1, by = 24, length.out = 5), as.POSIXct (as.Date ("2010-10-01") + 1 : 5)처럼 보입니다. 그런 다음 ts1의 날짜가 24 번 반복되었지만 ts2 값이있는 데이터 프레임을 가져와야합니다. 적어도 그것이 내가 만든 것입니다. –

관련 문제