Объедините данные панели, чтобы получить сбалансированные данные панели

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

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

Желаемый результат выглядит следующим образом: я хочу объединить фреймы данных панели таким образом, чтобы каждая переменная располагалась в хроническом порядке, и если данные не могут быть недоступны в течение года, то у них есть NA в 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

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


person Community    schedule 24.02.2016    source источник


Ответы (2)


Для этого есть функция. Объедините фреймы данных с 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)
person Pierre L    schedule 24.02.2016
comment
Когда я запустил эту часть кода newdf <- complete(df3, Month, variable), я получаю ошибку Error: cannot join on columns 'Month' x 'Month': Can't join on 'Month' x 'Month' because of incompatible types (yearmon / yearmon) . Является ли complete также частью пакета tidyr? - person ; 24.02.2016
comment
Ваш формат даты снова преследует вас. Добавьте эту строку между двумя другими df3[,1] <- as.character(df3[,1]) - person Pierre L; 24.02.2016
comment
Кажется немного лишним использовать do.call(rbind, list(...)) вместо rbind - person Alex W; 24.02.2016
comment
Все работает, но ничего не происходит, когда я запускаю код заказа df5 <- df4[order(df4$variable,df4$Month),] - person ; 25.02.2016
comment
Столбец переменных был упорядочен, но снова месяцы в алфавитном порядке, хотя я запустил зоопарк и проверил класс месяца, его символ - person ; 25.02.2016
comment
Вывод добавлен для справки. Даты отсортированы. Наряду с переменным столбцом - person Pierre L; 25.02.2016
comment
base R и data.table не имеют проблемы с преобразованием. Вы также можете использовать решение @Jaap ниже - person Pierre L; 25.02.2016
comment
И когда я запускаю df4[,1] <- as.yearmon(newdf$Month, "%b-%y"), я получаю _2 _ [‹-. Data.frame( * tmp * , , 1, value = c(NA_character_, NA_character_, : replacement has 29100 rows, data has 67752 - person ; 25.02.2016
comment
Из-за конфиденциальности моих данных я не могу публиковать или предоставлять их публично. Спасибо за вашу помощь - person ; 25.02.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person Pierre L; 25.02.2016
comment
У меня есть вопрос, если у меня есть другой фрейм данных в форме данных панели, но он имеет разные данные для компаний, которые могут и не могут быть в фрейме данных, как показано выше, как я могу объединить их так же, как указано выше, чтобы у меня был другой столбец после beta6. Между ними есть общий месяц и столбец переменных. - person ; 25.02.2016
comment
Комментарии - не лучшее место, чтобы задать новый вопрос. Слишком много двусмысленности - person Pierre L; 25.02.2016
comment
Хорошо, я опубликую новый вопрос, но я надеюсь, что он не будет отмечен как повторяющийся. - person ; 25.02.2016
comment
Не беспокойтесь о дубликатах. Обучение - вот что важно. Вы узнаете гораздо больше о R после того, как этот проект будет завершен. - person Pierre L; 25.02.2016

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

основание R:

Свяжите фреймы данных в один:

df3 <- rbind(df1,df2)

Создайте эталонный фрейм данных со всеми возможными комбинациями 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:

Свяжите фреймы данных в один с помощью rbindlist, который возвращает data.table:

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)]
person Jaap    schedule 24.02.2016
comment
У меня есть базовый R, и он работает хорошо, единственное, если вы могли заметить на последней иллюстрации, данные упорядочены таким образом, что co. A имеет значения сначала для 2005 и 2006 годов, а затем co. B для 2005 и 2006 годов. Но когда я заказываю его, я получаю значения за 2005 год для A, а затем за 2005 год для B. - person ; 25.02.2016