Объединение данных в списки списка - PullRequest
2 голосов
/ 20 июня 2020

Я импортирую данные из нескольких файлов excel с помощью пакета readxl, и я сделал функцию в своем скрипте, чтобы импортировать только c листы, которые мне нужны

read_excel_sheets <- function(excelDoc) {
     sheets <- readxl::excel_sheets(excelDoc)
     sheets <- sheets[4:6]
     x <- lapply(sheets, function(X) readxl::read_excel(excelDoc, sheet = X))
     return(x)
}
#load files in folder
rawfiles <- list.files()
IMPORT <- lapply(rawfiles, FUN = read_excel_sheets)

После загрузки файлов в моей папке в моем сценарии ИМПОРТ становится списком [10], который содержит список [3] внутри него, в основном списки внутри списка.

К сожалению, я не могу использовать reduce (full_join) для сбора данных в одну таблицу данных. Я пробовал работать только с одним файлом excel и использовать unlist (), чтобы посмотреть, могу ли я вывести свои листы из списков list, но это не сработало.

Test <- read_excel_sheets("Hop_L_Trial1.xlsx")
Test_Test <- unlist(Test)

Я также пробовал

rawfiles <- list.files()
IMPORT <- lapply(rawfiles,
                FUN = read_excel_sheets) 
Test_3 <- rbindlist(IMPORT) 

и получил ошибку «Столбец 1 элемента 1 имеет длину 2, несовместимую со столбцом 2, который имеет длину 6. Только столбцы длиной 1 перерабатываются ". Мы будем очень благодарны за любые предложения о том, как объединить мои данные в одну таблицу данных, спасибо.

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Для этого data.table::rbindlist подход просто установите fill=T:

library(data.table)

dt_list = lapply(5:10, function(i) {
  data.table(rnorm(i))
})
dt=rbindlist(dt_list, fill=T) 
1 голос
/ 20 июня 2020

Вы можете использовать map_df из purrr для получения данных в виде единого фрейма данных.

read_excel_sheets <- function(excelDoc) {
  sheets <- readxl::excel_sheets(excelDoc)
  sheets <- sheets[4:6]
  x <- purrr::map_df(sheets, function(X) readxl::read_excel(excelDoc, sheet = X))
  return(x)
}

IMPORT <- purrr::map_df(rawfiles, FUN = read_excel_sheets)

Вы также можете использовать do.call + rbind базовые функции R.

read_excel_sheets <- function(excelDoc) {
  sheets <- readxl::excel_sheets(excelDoc)
  sheets <- sheets[4:6]
  x <- do.call(rbind, lapply(sheets, function(X) readxl::read_excel(excelDoc, sheet = X)))
  return(x)
}

IMPORT <- do.call(rbind, lapply(rawfiles, FUN = read_excel_sheets))
0 голосов
/ 20 июня 2020

Вы можете использовать bind_rows из пакета dplyr, часть тидиверсии:

x <- list(tibble(x=runif(5)),  tibble(x=runif(5)))
y <- list(tibble(x=runif(5)),  tibble(x=runif(5)))
z = list(x, y)

ans <- bind_rows(z)
ans
A tibble: 20 x 1
        x
    <dbl>
 1 0.746 
 2 0.0669
 3 0.612 
 4 0.0702
 5 0.990 
 6 0.301 
 7 0.177 
 8 0.799 
 9 0.242 
10 0.741 
11 0.651 
12 0.113 
13 0.927 
14 0.506 
15 0.477 
16 0.922 
17 0.217 
18 0.566 
19 0.539 
20 0.327 

Используйте (скажем) bind_rows(..., .id="Sheet"), если вам нужно отслеживать, к какому элементу списка пришла каждая строка с оригинала.

...