Объединение двух фреймов данных с разными строками в R - PullRequest
3 голосов
/ 31 октября 2019

У меня есть два кадра данных. Первый из них выглядит как

Country    Year  production
Germany    1996  11
France     1996  12
Greece     1996  15
UK         1996  17
USA        1996  24

Второй содержит все страны, которые находятся в первом фрейме данных, плюс еще несколько стран на 2018 год. Выглядит примерно так:

Country    Year   production
Germany    2018   27
France     2018   29
Greece     2018   44
UK         2018   46
USA        2018   99
Austria    2018   56
Japan      2018   66

Я хотел бы объединить два фрейма данных, и итоговая таблица должна выглядеть следующим образом:

Country    Year  production
Germany    1996   11
France     1996   12
Greece     1996   15
UK         1996   17
USA        1996   24
Austria    1996   NA
Japan      1996   NA
Germany    2018   27
France     2018   29
Greece     2018   44
UK         2018   46
USA        2018   99
Austria    2018   56
Japan      2018   66

Я пробовал несколько функций, включая full_join, merge и rbind, но они нене работаетУ кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Рассмотрим базу R с expand.grid и merge (и избегайте любых зависимостей, если вы являетесь автором пакета):

# BUILD DF OF ALL POSSIBLE COMBINATIONS OF COUNTRY AND YEAR
all_country_years <- expand.grid(Country=unique(c(df_96$Country, df_18$Country)),
                                 Year=c(1996, 2018))

# MERGE (LEFT JOIN)
final_df <- merge(all_country_years, rbind(df_96, df_18), by=c("Country", "Year"), 
                  all.x=TRUE)

# ORDER DATA AND RESET ROW NAMES
final_df <- data.frame(with(final_df, final_df[order(Year, Country),]),
                       row.names = NULL)

final_df
#    Country Year production
# 1  Germany 1996         11
# 2   France 1996         12
# 3   Greece 1996         15
# 4       UK 1996         17
# 5      USA 1996         24
# 6  Austria 1996         NA
# 7    Japan 1996         NA
# 8  Germany 2018         27
# 9   France 2018         29
# 10  Greece 2018         44
# 11      UK 2018         46
# 12     USA 2018         99
# 13 Austria 2018         56
# 14   Japan 2018         66

Демо

2 голосов
/ 31 октября 2019

С dplyr и tidyr вы можете использовать:

bind_rows(df1, df2) %>%
 complete(Country, Year)

   Country  Year production
   <chr>   <int>      <int>
 1 Austria  1996         NA
 2 Austria  2018         56
 3 France   1996         12
 4 France   2018         29
 5 Germany  1996         11
 6 Germany  2018         27
 7 Greece   1996         15
 8 Greece   2018         44
 9 Japan    1996         NA
10 Japan    2018         66
11 UK       1996         17
12 UK       2018         46
13 USA      1996         24
14 USA      2018         99
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...