Как сделать сопоставление с образцом для нескольких фреймов данных с идентификатором ссылочного столбца в R? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть родительский запрос data.frame с 403 строками и 5 столбцами, где я буду использовать его NUTS_ID и NUTS_NAME в качестве справочных столбцов для фильтрации данных в целевых data.frames (427 строк и 7 столбцов), пожалуйста.посмотрите пример фрагментов данных на лету .Для этого я попытался base::match получить общие строки в целевом data.frame, используя code столбцы в запросе data.frame, но это неэффективно, поскольку шаблон не согласован.

Вот заголовок запроса data.frame:

> query_df
     CNTR_CODE   FID LEVL_CODE NUTS_ID                  NUTS_NAME
  1:        DE DEF0D         3   DEF0D                   Segeberg
  2:        DE DEF0E         3   DEF0E                  Steinburg
  3:        DE DEF0F         3   DEF0F                   Stormarn
  4:        DE DEG01         3   DEG01   Erfurt, Kreisfreie Stadt
  5:        DE DE119         3   DE119             Hohenlohekreis
 ---                                                             
398:        DE DEG0K         3   DEG0K           Saale-Orla-Kreis
399:        DE DEG0L         3   DEG0L                      Greiz
400:        DE DEG0M         3   DEG0M           Altenburger Land
401:        DE DEG0N         3   DEG0N Eisenach, Kreisfreie Stadt
402:        DE DEG0P         3   DEG0P              Wartburgkreis

Вот фрагменты целевого data.frames:

> target_df
     Country                       Name
  1:   de111      Stuttgart, Stadtkreis
  2:   de112                  Böblingen
  3:   de113                  Esslingen
  4:   de114                  Göppingen
  5:   de115                Ludwigsburg
 ---                                   
423:   deg0k           Saale-Orla-Kreis
424:   deg0l                      Greiz
425:   deg0m           Altenburger Land
426:   deg0n Eisenach, Kreisfreie Stadt
427:   deg0p              Wartburgkreis

Вот моя попытка прочитать пример фрагментов данных на лету :

library(openxlsx)
query_df <- read.xlsx("example_data_snippets.xlsx", sheet = 1)
target_df1 <- read.xlsx('example_data_snippets.xlsx', sheet = 2)

для фильтрации данных в целевом data.frame с использованием ключа ссылочного столбца в запросе data.frame, я просто попытался сделать следующее:

target_df1[match(query_df$NUTS_ID, target_df$Country),]

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

желаемый вывод :

в моем желаемом выводе отфильтрованный data.frame может иметь такой же код, NUTS_ID, найдя совпадение.

Как я могу оптимизировать свое решение выше?Есть ли эффективный способ фильтрации данных в нескольких data.frames с помощью справочного столбца в запросе data.frame?Есть ли в dplyr или data.table эффективные утилиты?Есть ли эффективный способ сделать это?Есть идеи?

1 Ответ

0 голосов
/ 21 мая 2018

Я использую readxl вместо openxlsx;это просто вопрос предпочтений.Использование toupper для страны, чтобы иметь возможность объединять таблицы.

library(readxl)

query_df <- read_excel("example_data_snippets.xlsx", sheet = 1)
target_df1 <- read_excel('example_data_snippets.xlsx', sheet = 2)


target_df1 %>% 
  mutate(Country = toupper(Country)) %>% 
  inner_join(query_df, by = c("Country" = "NUTS_ID"))
# A tibble: 357 x 12

Или, если данные из query_df не нужны, можно использовать semi_join.

target_df1 %>% 
  mutate(Country = toupper(Country)) %>% 
  semi_join(query_df, by = c("Country" = "NUTS_ID"))
# A tibble: 357 x 8

загрузка всех файлов в 1 результирующем списке:

query_df <- read_excel("example_data_snippets.xlsx", sheet = 1)
target_df1 <- read_excel('example_data_snippets.xlsx', sheet = 2)
# need to skip first line :-( otherwise could automate reading in all sheets in one go.
target_df2 <- read_excel('example_data_snippets.xlsx', sheet = 3, skip = 1)
target_df3 <- read_excel('example_data_snippets.xlsx', sheet = 4, skip = 1)

#set nuts_id to lower so it matches all the Country names in the other sheets.
query_df$NUTS_ID <- tolower(query_df$NUTS_ID)     


result <- lapply(list(target_df1, target_df2, target_df3), function(x) inner_join(query_df, x, by = c("NUTS_ID" = "Country")))  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...