Как пропустить вторую строку с помощью readxl

Мне дали электронную таблицу Excel: имена столбцов находятся в первой строке, мусорный текст - во второй строке, а фактические данные начинаются в третьей строке. Я хочу использовать пакет readxl для считывания этого в фрейм данных, сохраняя имена столбцов из первой строки, но отбрасывая вторую строку.

Простое чтение всех строк в фрейм данных с последующим удалением первой строки не сработает, потому что мусор, который находится во второй строке файла Excel, не будет соответствовать типу данных столбца.

Я хотел бы сделать это без ручного редактирования файла Excel.


person Matthew    schedule 03.08.2018    source источник
comment
Вам нужно будет прочитать весь файл (который даст вам имена столбцов), а затем вручную удалить строку 2 и, возможно, изменить порядок записей столбцов в строках под строкой 2, чтобы они соответствовали именам столбцов. Я нашел read_excel довольно надежным, когда дело доходит до бессмысленных строк: он все равно будет читать файл, но любая потенциальная очистка зависит от вас.   -  person Maurits Evers    schedule 03.08.2018


Ответы (2)


Я бы предложил прочитать весь файл, а затем вручную удалить строку 2.

В качестве примера приведем снимок экрана с образцом файла Excel.

введите описание изображения здесь

Мы читаем весь файл и удаляем строку 1 (которая соответствует второй строке в листе Excel).

library(readxl)
library(tidyverse)
df <- read_excel("Workbook1.xlsx")[-1, ] %>%
    map_df(~parse_guess(.))
df
## A tibble: 2 x 4
#      A     B     C     D
#  <int> <int> <int> <int>
#1    20    30    40    50
#2    30    40    50    60
person Maurits Evers    schedule 03.08.2018
comment
Поскольку OP упомянул, что удаление ошибочной строки вручную приводит к нарушению его типов данных, следующим логическим шагом будет: df %>% mutate_if(is.character, as.numeric). Конечно, это предполагает, что нет настоящих символьных столбцов, но вызов mutate также можно изменить, чтобы адресовать только те столбцы, которые нуждаются в преобразовании. - person tifu; 03.08.2018
comment
В качестве альтернативы, после удаления второй строки, повторно проанализируйте все столбцы, например. используя purrr :: map и readr :: parse_guess: df %>% map_df(~parse_guess(.)) % из magrittr, все в tidyverse - person Jannik Buhr; 03.08.2018
comment
@JannikBuhr О, мне это нравится. Спасибо и добавил. - person Maurits Evers; 03.08.2018

Вот еще одно решение:

Сначала прочтите первую строку с помощью readxl и сохраните как массив (поскольку он импортирует только первую строку, это быстро):

col_names <- array(read_excel('C:/spreadsheet.xlsx', sheet = 'Sheet1', n_max = 1, col_names = FALSE))

Во-вторых, прочтите ту же таблицу, но начните со своих данных:

df <- data.frame(read_excel('C:/spreadsheet.xlsx', sheet = 'Sheet1', skip = 2, col_names = FALSE))

Наконец, переименуйте столбцы фрейма данных, используя первый шаг:

colnames(df) <- col_names
person JamesR    schedule 06.12.2018