Используйте для l oop over list в R, чтобы связать элементы, если они существуют - PullRequest
0 голосов
/ 23 марта 2020

У меня есть список 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 из списка выходных данных.

Большое спасибо!

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