Объединение двух разных фреймов данных в R - PullRequest
4 голосов
/ 19 ноября 2010

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

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 для дат, которые больше не в порядке возрастания.

Большое спасибо за вашу поддержку
Dani

Ответы [ 2 ]

4 голосов
/ 19 ноября 2010

Сначала используйте класс временных рядов (например, 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))
2 голосов
/ 19 ноября 2010

Я полностью пропустил пункт с первым постом.Этот делает дату.Но я согласен с Шейном в том, что, если какая-либо последующая функция не требует фреймов данных, то временной ряд - хорошая идея.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...