Создать Dataframe импортировать несколько листов в R - PullRequest
0 голосов
/ 28 марта 2020

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

path <- 'PRT 2017.xlsx' #Just one file
sheets <- excel_sheets(path)
df2017 <- map_df(sheets,~ read_excel(path, sheet = .x), .id = "sheet")

, но он генерирует следующую ошибку:

Ошибка: столбец ZZn не может быть преобразован из символьной в числовую Además: было 50 или более предупреждений (используйте warnings (), чтобы увидеть первые 50)

Структура листа (имя листа: 201701):

FF                          ZN   ZZn     Q  
28/01/2017 09:07:32 a.m.   612   61201   4
12/01/2017 06:49:01 a.m.   728   DFT     10 

, и результат, который я хотел бы получить:

FF                          ZN   ZZn     Q   Sheet
28/01/2017 09:07:32 a.m.   612   61201   4   201701
12/01/2017 06:49:01 a.m.   728   DFT     10  201701
28/02/2018 04:21:34 p.m.   405   40502   20  201802

Спасибо ...

1 Ответ

0 голосов
/ 29 марта 2020

Похоже, проблема в том, что для некоторых листов ZZn содержит только цифры c, в то время как для других он также содержит символы. Как следствие, для некоторых листов ZZn является вектором цифр c, а для других - вектором символов. Однако связывание df вместе не работает в этом случае. Это то, что сообщение об ошибке говорит вам.

В качестве примера рассмотрим следующее:

library(dplyr)
library(purrr)

sheets <- list(
  a = data.frame(
    ZN = c(1, 2),
    ZZn = c(61201, "DFT"),
    stringsAsFactors = FALSE
  ),
  b = data.frame(
    ZN = c(3, 4),
    ZZn = c(61201, 61202),
    stringsAsFactors = FALSE
  )
)

# Error
map_df(sheets, ~ .x, .id = "sheet")
#> Error: Column `ZZn` can't be converted from character to numeric

# Works
map_df(sheets, ~ mutate(.x, ZZn = as.character(ZZn)), .id = "sheet")
#>   sheet ZN   ZZn
#> 1     a  1 61201
#> 2     a  2   DFT
#> 3     b  3 61201
#> 4     b  4 61202

Создано в 2020-03-29 пакетом Представления (v0.3.0)

Поэтому вам нужно преобразовать числа c в символы, прежде чем связывать листы вместе, например

map_df(sheets, ~ read_excel(path, sheet = .x) %>% 
  mutate(ZZn = as.character(ZZn)), .id = "sheet")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...