Как сделать цикл for, чтобы игнорировать несколько столбцов и сделать привязку всех листов (независимо от общего количества листов) в файле Excel - PullRequest
0 голосов
/ 24 мая 2019

Я хочу сделать несколько заказов в цикле for, которые

  1. пренебрегают первой строкой ниже столбца
  2. изменить имя всего столбца на строчные и исключить все пробелы между словами (если есть)
  3. пренебречь несколькими столбцами и оставить остальные
  4. сделать rbind для всех листов в файле Excel

Я уже сделал это

library(tidyverse)
library(readxl)
library(xlsx)
library(reshape2)
setwd("D:/Plan")
file<-"Plan.xlsx"
excel_sheets(file)
sheet=excel_sheets(file)

for (i in 1:1) {
    file=read_excel(file, sheet=sheet[i])
    file<-file[-1,]
    judul=colnames(file)
    judul=tolower(judul)
    judul=gsub(' ','',judul)
    colnames(file)=judul
    file %>% filter(!is.na(promo))
    file=file %>% filter(!is.na(promo))
    data=file[,names(file) %in% c("promo","startdate","enddate","sku","marketplacename","diskon","stok")]
}

out=data

for (i in 2:2) {
    file=read_excel(file, sheet=sheet[i])
    file<-file[-1,]
    judul=colnames(file)
    judul=tolower(judul)
    judul=gsub(' ','',judul)
    colnames(file)=judul
    file %>% filter(!is.na(promo))
    file=file %>% filter(!is.na(promo))
    data=file[,names(file) %in% c("promo","startdate","enddate","sku","marketplacename","diskon","stok")]
    x<-data
    out=rbind(out,x)
}

этот код является просто примером файла Excel с 2 листами.Настоящий файл представляет собой файл с несколькими листами, но я хочу выполнять эти заказы независимо от количества листов, поэтому я не редактирую сценарий каждый раз, когда нахожу различное количество листов в файле.Как это сделать?

1 Ответ

0 голосов
/ 24 мая 2019

Я бы сделал что-то вроде этого, где я итерирую непосредственно по именам листов, а не используя индексы. Нет гарантии, что этот код будет работать напрямую, поскольку вы не предоставили нам пример данных для тестирования. Тем не менее, он должен указывать вам правильное направление и, вероятно, будет работать с некоторыми незначительными изменениями:

library(readxl)
library(stringr) # Needed for `str_*` functions.
library(dplyr)
library(magrittr) # Needed for `set_colnames`.

file_name <- "Plan.xlsx"
sheets <- excel_sheets(file_name)
df_final <- tibble()

for (sheet in sheets){
    df_final <- read_excel(file_name, sheet = sheet) %>%
        select(-1) %>% 
        set_colnames(str_remove_all(names(.), "\\s") %>% str_to_lower()) %>%  
        filter(!is.na(promo)) %>%
        select(promo, startdate, enddate, sku, marketplacename, diskon, stok) %>% 
        bind_rows(df_final, .)
}

Функции stringr не являются абсолютно необходимыми. Я нахожу соглашения об именах полезными при интерпретации моего кода позже, но вы можете использовать gsub и tolower, если предпочитаете их. Вы можете сокращать значения, если выбранные вами столбцы являются последовательными, то есть вы можете сделать promo:stok, если все остальные нужные столбцы находятся между этими двумя. Функция set_colnames взята из magrittr и предлагает краткую, цепную альтернативу colnames(df) <- some_names. Все остальное больше или меньше напоминает ваш код, просто он немного очищен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...