Как использовать purrr: map () для чтения листов из нескольких файлов Excel? - PullRequest
1 голос
/ 24 марта 2020

У меня есть столбец с колонкой для путей к файлам и колонкой для имени листов (пути удалены для безопасности):

x <- structure(list(file = c("2003_2005_DataDictionary.xlsx", "2003_2005_DataDictionary.xlsx", 
"2003_2005_DataDictionary.xlsx", "2003_2005_DataDictionary.xlsx", 
"2003_2005_DataDictionary.xlsx", "2003_2005_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx", 
"1996_2002_DataDictionary.xlsx", "1996_2002_DataDictionary.xlsx"
), sheet = c("vartable05", "vartable04", "vartable03", "valuesets05", 
"valuesets04", "valuesets03", "vartable02", "vartable01", "vartable00", 
"vartable99", "vartable98", "vartable97", "vartable96", "valuesets02", 
"valuesets01", "valuesets00", "valuesets99", "valuesets98", "valuesets97", 
"valuesets96")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-20L))

> x
# A tibble: 20 x 2
   file                          sheet      
   <chr>                         <chr>      
 1 2003_2005_DataDictionary.xlsx vartable05 
 2 2003_2005_DataDictionary.xlsx vartable04 
 3 2003_2005_DataDictionary.xlsx vartable03 
 4 2003_2005_DataDictionary.xlsx valuesets05
 5 2003_2005_DataDictionary.xlsx valuesets04
 6 2003_2005_DataDictionary.xlsx valuesets03
 7 1996_2002_DataDictionary.xlsx vartable02 
 8 1996_2002_DataDictionary.xlsx vartable01 
 9 1996_2002_DataDictionary.xlsx vartable00 
10 1996_2002_DataDictionary.xlsx vartable99 
11 1996_2002_DataDictionary.xlsx vartable98 
12 1996_2002_DataDictionary.xlsx vartable97 
13 1996_2002_DataDictionary.xlsx vartable96 
14 1996_2002_DataDictionary.xlsx valuesets02
15 1996_2002_DataDictionary.xlsx valuesets01
16 1996_2002_DataDictionary.xlsx valuesets00
17 1996_2002_DataDictionary.xlsx valuesets99
18 1996_2002_DataDictionary.xlsx valuesets98
19 1996_2002_DataDictionary.xlsx valuesets97
20 1996_2002_DataDictionary.xlsx valuesets96

Мне нужно прочитать каждый лист, используя read_excel() и объединить к одному фрейму данных, однако следующий код не работает:

x %>% 
   map_dfr(~read_excel(path = .$file, sheet = .$sheet))
#Error in .$file : $ operator is invalid for atomic vectors
```

What am I doing wrong? I've tried imap as well with no luck.

1 Ответ

1 голос
/ 24 марта 2020

Мы можем использовать map2 для соответствующих элементов каждого столбца

library(purrr)
map2(x$file, x$sheet, ~ read_excel(path = .x, sheet = .y)

Или с pmap

pmap(x, ~ read_excel(path = ..1, sheet = ..2))

Или, если мы переименуем столбцы,

x %>%
   rename(path = file) %>%
   pmap(read_excel)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...