У меня есть список c .400 элементов, каждый из которых разделен на 5 дополнительных компонентов. Они заполнены данными из таблиц Excel (после некоторых манипуляций в R), но не каждый компонент будет заполнен для каждой строки.
Мой вопрос: как я могу связать каждый компонент в списке, если он существует? Например, если оба существуют, это будет rbind
outputs[[1]][[1]]
с outputs[[2]][[1]]
.
. Я попытался создать что-то для репликации ниже:
x - это список, составленный из 3 переменные, первая - это путь (символы, составленные из названий таблиц Excel, в которых я читал), sheet_name (символы, имя каждой вкладки в таблицах Excel) и данные (data.frame, составленные из данные в каждой вкладке).
paths <- list.files(folderpath, pattern = "*.xlsx") # read in all file names with xlsx
x <- tibble::data_frame(path = paths) # make into data frame
x <- dplyr::mutate(x, sheet_name = purrr::map(path, readxl::excel_sheets)) # show number of sheets
x <- tidyr::unnest(x) # each row as a path and sheet name
x <- dplyr::mutate(x, data = purrr::map2(path, sheet_name, ~ readxl::read_excel(.x, .y))) # add data column with data for each tab
Затем я создаю следующий список, называемый «выходные данные», с 5 переменными для каждого элемента списка (который будет заполнен частью 1, частью 2, частью 3 , Часть 4 и часть 5, если они существуют на вкладке)
outputs <- vector(mode = "list", length = nrow(x)) # make list to put data into
for(i in seq_along(outputs)){
outputs[[i]] <- vector(mode = "list", length = 5L)
names(outputs)[[i]] <- paste(x$path[[i]], x$sheet_name[[i]], sep = "___")
}
Затем я запускаю для l oop, чтобы заполнить соответствующий элемент в каждом l oop.
Я хотел бы добавить для l oop, который сначала проверяет, существует ли outputs[[k]][[1]]
, где k = length(outputs)
, и, если это так, добавить все существующие outputs[[k]][[1]]
в новый фрейм данных и связать его в один большой фрейм данных .
Я думаю, что это будет выглядеть примерно так, но я не слишком Как это будет работать:
#create part1 dataframe
for (k in 1:length(outputs)[[k]][[1]] {
if(exists(outputs[[k]][[1]]
part1 <- rbind(part1, [[k]][[1]]
}
Кроме того, я также хотел бы добавить два столбца для каждого существующего outputs[[k]][[1]]
, с путем и sheet_name
из списка выходных данных.
Большое спасибо!