2016-02-24 3 views
5

У меня есть несколько фреймов данных в форме данных панели. Теперь я хочу объединить эти фреймы данных панели в одну панель данных. Эти кадры данных имеют общий и разный между ними. Я проиллюстрировать следующим образом:Данные панели слияния для получения данных балансной панели

df1:

Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
Jan-05  A  1  2  3  4  5  6 
Feb-05  A  2  3  4  5  6  7 
Mar-05  A  3  4  5  6  7  8 
Apr-05  A  4  5  6  7  8  9 
May-05  A  5  6  7  8  9  10 
Jun-05  A  6  7  8  9  10  11 
Jul-05  A  7  8  9  10  11  12 
Aug-05  A  8  9  10  11  12  13 
Sep-05  A  9  10  11  12  13  14 
Oct-05  A  10  11  12  13  14  15 
Nov-05  A  11  12  13  14  15  16 
Dec-05  A  12  13  14  15  16  17 
Jan-05  B  12  12  12  12  12  12 
Feb-05  B  12  12  12  12  12  12 
Mar-05  B  12  12  12  12  12  12 
Apr-05  B  12  12  12  12  12  12 
May-05  B  12  12  12  12  12  12 
Jun-05  B  12  12  12  12  12  12 
Jul-05  B  12  12  12  12  12  12 
Aug-05  B  12  12  12  12  12  12 
Sep-05  B  12  12  12  12  12  12 
Oct-05  B  12  12  12  12  12  12 
Nov-05  B  12  12  12  12  12  12 
Dec-05  B  12  12  12  12  12  12 

df2:

Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
Jan-06  A  1  2  3  4  5  6 
Feb-06  A  2  3  4  5  6  7 
Mar-06  A  3  4  5  6  7  8 
Apr-06  A  4  5  6  7  8  9 
May-06  A  5  6  7  8  9  10 
Jun-06  A  6  7  8  9  10  11 
Jul-06  A  7  8  9  10  11  12 
Aug-06  A  8  9  10  11  12  13 
Sep-06  A  9  10  11  12  13  14 
Oct-06  A  10  11  12  13  14  15 
Nov-06  A  11  12  13  14  15  16 
Dec-06  A  12  13  14  15  16  17 
Jan-06  C  12  12  12  12  12  12 
Feb-06  C  12  12  12  12  12  12 
Mar-06  C  12  12  12  12  12  12 
Apr-06  C  12  12  12  12  12  12 
May-06  C  12  12  12  12  12  12 
Jun-06  C  12  12  12  12  12  12 
Jul-06  C  12  12  12  12  12  12 
Aug-06  C  12  12  12  12  12  12 
Sep-06  C  12  12  12  12  12  12 
Oct-05  C  12  12  12  12  12  12 
Nov-05  C  12  12  12  12  12  12 
Dec-05  C  12  12  12  12  12  12 

Нужный выход следующим образом, я хочу объединить кадры данных панели таким образом, что каждая переменная и если данные не могут быть годны, то это имеет НС под Beta1, Beta2 и так далее.

Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
Jan-05 A   1 2  3  4  5  6 
Feb-05 A   2 3  4  5  6  7 
Mar-05 A   3 4  5  6  7  8 
Apr-05 A   4 5  6  7  8  9 
May-05 A   5 6  7  8  9  10 
Jun-05 A   6 7  8  9  10  11 
Jul-05 A   7 8  9  10  11  12 
Aug-05 A   8 9  10  11  12  13 
Sep-05 A   9 10  11  12  13  14 
Oct-05 A   10 11  12  13  14  15 
Nov-05 A   11 12  13  14  15  16 
Dec-05 A   12 13  14  15  16  17 
Jan-06 A   1 2  3  4  5  6 
Feb-06 A   2 3  4  5  6  7 
Mar-06 A   3 4  5  6  7  8 
Apr-06 A   4 5  6  7  8  9 
May-06 A   5 6  7  8  9  10 
Jun-06 A   6 7  8  9  10 11 
Jul-06 A   7 8  9  10  11 12 
Aug-06 A   8 9  10  11  12 13 
Sep-06 A   9 10  11  12  13 14 
Oct-06 A   10 11  12  13  14 15 
Nov-06 A   11 12  13  14  15 16 
Dec-06 A   12 13  14  15  16 17 
Jan-05 B   12 12  12  12  12 12 
Feb-05 B   12 12  12  12  12 12 
Mar-05 B   12 12  12  12  12 12 
Apr-05 B   12 12  12  12  12 12 
May-05 B   12 12  12  12  12 12 
Jun-05 B   12 12  12  12  12 12 
Jul-05 B   12 12  12  12  12 12 
Aug-05 B   12 12  12  12  12 12 
Sep-05 B   12 12  12  12  12 12 
Oct-05 B   12 12  12  12  12 12 
Nov-05 B   12 12  12  12  12 12 
Dec-05 B   12 12  12  12  12 12 
Jan-06 B   NA NA  NA  NA  NA NA 
Feb-06 B   NA NA  NA  NA  NA NA 
Mar-06 B   NA NA  NA  NA  NA NA 
Apr-06 B   NA NA  NA  NA  NA NA 
May-06 B   NA NA  NA  NA  NA NA 
Jun-06 B   NA NA  NA  NA  NA NA 
Jul-06 B   NA NA  NA  NA  NA NA 
Aug-06 B   NA NA  NA  NA  NA NA 
Sep-06 B   NA NA  NA  NA  NA NA 
Oct-06 B   NA NA  NA  NA  NA NA 
Nov-06 B   NA NA  NA  NA  NA NA 
Dec-06 B   NA NA  NA  NA  NA NA 
Jan-05 C   NA NA  NA  NA  NA NA 
Feb-05 C   NA NA  NA  NA  NA NA 
Mar-05 C   NA NA  NA  NA  NA NA 
Apr-05 C   NA NA  NA  NA  NA NA 
May-05 C   NA NA  NA  NA  NA NA 
Jun-05 C   NA NA  NA  NA  NA NA 
Jul-05 C   NA NA  NA  NA  NA NA 
Aug-05 C   NA NA  NA  NA  NA NA 
Sep-05 C   NA NA  NA  NA  NA NA 
Oct-05 C   NA NA  NA  NA  NA NA 
Nov-05 C   NA NA  NA  NA  NA NA 
Dec-05 C   NA NA  NA  NA  NA NA 
Jan-06 C   12 12  12  12  12 12 
Feb-06 C   12 12  12  12  12 12 
Mar-06 C   12 12  12  12  12 12 
Apr-06 C   12 12  12  12  12 12 
May-06 C   12 12  12  12  12 12 
Jun-06 C   12 12  12  12  12 12 
Jul-06 C   12 12  12  12  12 12 
Aug-06 C   12 12  12  12  12 12 
Sep-06 C   12 12  12  12  12 12 
Oct-06 C   12 12  12  12  12 12 
Nov-06 C   12 12  12  12  12 12 
Dec-06 C   12 12  12  12  12 12 

Как я уже говорил ранее, что я несколько кадров данных и их объединения, вероятно, приведет сотни тысяч строк, так что я мог я решать вопросы памяти и пространства. Я бы очень признателен вам за вашу помощь.

ответ

5

Для этого есть функция. Объедините кадры данных с rbind. Затем используйте complete. Это будет выглядеть через группы в variable и заполнить любую с пропущенными значениями:

library(tidyr) 
df3 <- do.call(rbind.data.frame, list(df1, df2)) 
df3$Month <- as.character(df3$Month) 
df4 <- complete(df3, Month, variable) 
df4$Month <- as.yearmon(df4$Month, "%b %Y") 
df5 <- df4[order(df4$variable,df4$Month),] 
df5 
# Source: local data frame [72 x 8] 
# 
#  Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
#  (yrmn) (fctr) (int) (int) (int) (int) (int) (int) 
# 1 Jan 2005  A  1  2  3  4  5  6 
# 2 Feb 2005  A  2  3  4  5  6  7 
# 3 Mar 2005  A  3  4  5  6  7  8 
# 4 Apr 2005  A  4  5  6  7  8  9 
# 5 May 2005  A  5  6  7  8  9 10 
# 6 Jun 2005  A  6  7  8  9 10 11 
# 7 Jul 2005  A  7  8  9 10 11 12 
# 8 Aug 2005  A  8  9 10 11 12 13 
# 9 Sep 2005  A  9 10 11 12 13 14 
# 10 Oct 2005  A 10 11 12 13 14 15 
# ..  ...  ... ... ... ... ... ... ... 

Альтернативная реализация с dplyr & tidyr:

library(dplyr) 
library(tidyr) 

df3 <- bind_rows(df1, df2) %>% 
    complete(Month, variable) 
+0

Когда я запустил эту часть кода 'newdf <- complete (df3, Month, variable)' Получаю ошибку 'Ошибка: не могу присоединиться к столбцам 'Месяц' x 'Месяц': Невозможно присоединиться к 'Месяцу' x 'Месяц' из-за несовместимых типов (yearmon/yearmon) '. Является ли «полным» частью пакета tidyr? –

+0

Ваш формат даты снова преследует вас. Добавьте эту строку между двумя другими 'df3 [, 1] <- as.character (df3 [, 1])' –

+0

Кажется немного лишним использовать 'do.call (rbind, list (...))' vs just 'rbind' –

4

две альтернативные возможности которых особенно data.table представляют интерес, когда проблема связана с частотой и памятью:

основание R:

Привязка к dataframes вместе в один:

df3 <- rbind(df1,df2) 

Создать опорную dataframe со всеми возможными комбинациями Month и variable с expand.grid:

ref <- expand.grid(Month = unique(df3$Month), variable = unique(df3$variable)) 

объединить их вместе с all.x=TRUE поэтому вы убедитесь, что недостающие комбинации заполнены значениями NA:

merge(ref, df3, by = c("Month", "variable"), all.x = TRUE) 

Или (спасибо к @PierreLafortune):

merge(ref, df3, by=1:2, all.x = TRUE) 

data.table:

Свяжите dataframes в один с 'rbindlist', который возвращает «данные.стол ':

library(data.table) 
DT <- rbindlist(list(df1,df2)) 

Регистрация с ссылкой для обеспечения всех комбинаций присутствуют и отсутствуют те, которые заполнены NA:

DT[CJ(Month, variable, unique = TRUE), on = c(Month="V1", variable="V2")] 

Все вместе в одном вызове:

DT <- rbindlist(list(df1,df2))[CJ(Month, variable, unique = TRUE), on = c(Month="V1", variable="V2")] 

Альтернативным представляет собой обертывание rbindlist в setkey, а затем расширение с помощью CJ (перекрестное соединение):

DT <- setkey(rbindlist(list(df1,df2)), Month, variable)[CJ(Month, variable, unique = TRUE)] 
+0

У меня есть база R, и это хорошо работает, только если вы заметили, что в последней иллюстрации данные упорядочены так, что co. A имеет значения сначала для 2005 и 2006 годов, а затем co. B за 2005 и 2006 годы. Но когда я его заказываю, я получаю значения за 2005 год для A, а затем за 2005 год для B. –

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