2016-11-21 6 views
1

Я пытаюсь преобразовать ежеквартальные данные в ежедневные данные, добавив предыдущие значения в отсутствующие даты. Эти данные состоят из финансовых коэффициентов различных запасов. У моих данных есть метка строки, построенная из двух столбцов: тикер и дата. Поскольку у меня есть повторяющиеся даты для каждого запаса, я не уверен, как игнорировать тикер и повторно заполнять отсутствующие даты с предыдущими значениями.Добавить отсутствующие даты с предыдущими значениями в R - преобразование ежеквартально в ежедневные данные

Вот как небольшая выборка данных выглядит так далеко:

> df_new 
        de eps  pe ps pb 
APD 2015-09-30 1.373 1.6 21.463 2.772 3.784 
APD 2015-12-31 1.325 1.68 21.284 2.893 3.805 
APD 2016-03-31 1.411 -2.19 56.114 3.254 4.491 
SWKS 2003-03-31 0.402 -0.04 <NA> <NA> <NA> 
SWKS 2003-06-30 0.397 -0.04 -2.289 1.518 0.929 
SWKS 2003-09-30 0.62 -0.29 -2.799 2.046 1.877 
SWKS 2003-12-31 0.643 0.03 -25.426 2.045 1.905 
SWKS 2004-03-31 0.657 -0.06 -32.004 2.641 2.579 
SWKS 2004-06-30 0.584 0.09 -37.18 1.825 1.782 
SWKS 2004-09-30 0.555 0.1 65.806 1.881 1.962 
SWKS 2004-12-31 0.525 0.09 45.823 1.777 1.912 

И я хочу, чтобы выглядеть следующим образом (если еженедельно):

> df_new 
        de eps  pe ps pb 
APD 2015-09-30 1.373 1.6 21.463 2.772 3.784 
APD 2015-10-01 1.373 1.6 21.463 2.772 3.784 
APD 2015-10-02 1.373 1.6 21.463 2.772 3.784 
APD 2015-10-03 1.373 1.6 21.463 2.772 3.784 
... 
APD 2015-12-31 1.325 1.68 21.284 2.893 3.805 
APD 2016-01-01 1.325 1.68 21.284 2.893 3.805 
APD 2016-01-02 1.325 1.68 21.284 2.893 3.805 
APD 2016-01-03 1.325 1.68 21.284 2.893 3.805 
... 
APD 2016-03-31 1.411 -2.19 56.114 3.254 4.491 
APD 2016-04-01 1.411 -2.19 56.114 3.254 4.491 
APD 2016-04-02 1.411 -2.19 56.114 3.254 4.491 
APD 2016-04-03 1.411 -2.19 56.114 3.254 4.491 
... 
SWKS 2003-03-31 0.402 -0.04 <NA> <NA> <NA> 
SWKS 2003-04-01 0.402 -0.04 <NA> <NA> <NA> 
SWKS 2003-04-02 0.402 -0.04 <NA> <NA> <NA> 
SWKS 2003-04-03 0.402 -0.04 <NA> <NA> <NA> 
... 
SWKS 2003-06-30 0.397 -0.04 -2.289 1.518 0.929 
and so on... 

Я искал ответы, и это ссылка: Add missing xts/zoo data with linear interpolation in R немного близка к тому, что я хочу. Хотя я не уверен, что делать с тикером.

Большое вам спасибо за помощь!

ответ

2

Используйте by для применения анонимной функции, отображаемой к строкам каждого символа. Эта функция создает сетку g дат и объединяет ее с исходными строками кадра данных, применяя na.locf для заполнения значений NA. Наконец, мы используем do.call("rbind", ...), чтобы поместить объект "by" обратно.

library(zoo) # na.locf 

df <- do.call("rbind", by(df_new, df_new$symbol, function(x) { 
    rng <- range(x$date, na.rm = TRUE) 
    g <- data.frame(date = seq(rng[1], rng[2], "day")) 
    na.locf(merge(x, g, all = TRUE)) 
})) 

Примечание: вход df_new в воспроизводимой форме:

Lines <- " 
APD 2015-09-30 1.373 1.6 21.463 2.772 3.784 
APD 2015-12-31 1.325 1.68 21.284 2.893 3.805 
APD 2016-03-31 1.411 -2.19 56.114 3.254 4.491 
SWKS 2003-03-31 0.402 -0.04 <NA> <NA> <NA> 
SWKS 2003-06-30 0.397 -0.04 -2.289 1.518 0.929 
SWKS 2003-09-30 0.62 -0.29 -2.799 2.046 1.877 
SWKS 2003-12-31 0.643 0.03 -25.426 2.045 1.905 
SWKS 2004-03-31 0.657 -0.06 -32.004 2.641 2.579 
SWKS 2004-06-30 0.584 0.09 -37.18 1.825 1.782 
SWKS 2004-09-30 0.555 0.1 65.806 1.881 1.962 
SWKS 2004-12-31 0.525 0.09 45.823 1.777 1.912" 
df_new <- read.table(text = Lines, 
    col.names = c("symbol", "date", "de", "eps", "pe", "ps", "pb")) 
df_new$date <- as.Date(df_new$date) 
+0

Большое спасибо за ваш быстрый ответ G. Гротендика !! Мне было интересно, как делать то же самое, что вы делаете, но с именем строки (ярлыком), являющимся тикером и символом, вместе с тем, что мой файловый фрейм уже сохранен (например, rowname [1,1] - APD 2015-09 -30). Я объединяю различные базы данных в одну, но имею различную периодичность во всех из них, поэтому я использую имя строки в качестве метки для идентификации каждой из существующих баз данных. – marya

+0

@marya Вы, вероятно, хотите, чтобы 'rownames (df) <- paste (df $ symbol, df $ date)', но нет такой вещи, как операция индекса розеток '[1, 1]' ... – FXQuantTrader

+0

Спасибо за ваш комментарий FXQuantTrader! Я просто пытался привести пример rowname в первой строке и как-то написал это, но вы правы! не такая вещь, так что я плохой! (Первый раз на этом форуме :) ..) Мои базы данных уже объединены таким образом, когда имена ростов были символом и датой, используя функцию вставки, я действительно спрашивал, как получить функцию G. Grothendieck, написанную выше, но учитывая, что имена розеров похожи на это. Я предполагаю, что я могу использовать функцию separate() для использования функции выше или передать эту функцию перед paste(). Еще раз спасибо!!! Я очень ценю помощь! – marya