2010-11-19 4 views
4

У меня есть два кадра данных. Одна состоит из трех переменных, а именно «дата», «удар» и «т» с 20 наблюдений в сутки, 100 в месяц, и 1200 год (в торговых дней), который выглядит, как этоСлияние двух разных кадров данных в R

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

Поэтому для каждого месяца у меня есть определенные значения для цены и объема, от 10 до 40, от 0,1 до 0,7 соответственно.
Второй включает интерполированные значения из первого. Так что я не дату больше, однако небольшие шаги для других переменных:

Price  Vol 
    20   0.2 
    21   0.21 
    22   0.24 
    30   0.5 

Таким образом, в то время как один кадр показывает значения в дискретном времени, другой более или менее продолжительный характер.
Теперь мой вопрос: как можно определить R, чтобы объединить второй кадр данных в первый, взяв даты непрерывных цен/томов между двумя дискретными, чтобы получить что-то вроде этого:

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 должен выглядеть как зоопарк (seq (1, by = 24, length.out = 5), as.POSIXct (as.Date («2010-10-01») + 1: 5)). И тогда вы должны получить dataframe, где вы повторяете даты в ts1 24 раза, но со значениями ts2. По крайней мере, это то, что я сделал из этого. –

Смежные вопросы