Создайте список таблиц с уникальными именами, используя цикл for - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над проектом, в котором я хочу создать список таблиц, содержащих данные, которые я прочитал из Excel. Идея будет заключаться в том, чтобы обратиться к столбцам этих разных таблиц для выполнения анализа. Но я застрял в том, как называть тибблы в for l oop с именем, которое изменяется в зависимости от переменной for l oop. Я не уверен, что поступаю правильно. Вот код, который у меня есть.

filenames <- list.files(path = getwd(), pattern = "xlsx")
RawData <- list()
for(i in filenames) {
  RawData <- list(i <- tibble(read_xlsx(path = i, col_names = c('time', 'intesity'))))
}

У меня также есть проблема, когда прямо сейчас for l oop перезаписывает RawData при каждом повороте l oop, но я думаю, что это то, что я могу исправить, если Я могу заставить работать соглашение об именах. Если есть другой метод или структура данных, которые лучше подходят для этой задачи, я открыт для предложений.

Ура,

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Ваш код перезаписывает RawData на каждой итерации. Вы должны использовать что-то вроде этого, чтобы добавить новый тиббл в список RawData <- c(RawData, read_xlsx(...)).

Более простой способ - использовать lapply вместо a для l oop:

RawData <-
  lapply(
    filenames,
    read_xlsx,
    col_names = c('time', 'intesity')
  )
0 голосов
/ 28 мая 2020

Вот подход с map из пакета purrr

library(tidyverse)
filenames <- list.files(path = getwd(), pattern = "xlsx")

mylist <-  map(filenames, ~ read_xlsx(.x, col_names = c('time', 'intesity')) %>% 
             set_names(filenames)
0 голосов
/ 28 мая 2020

Аналогично ответу @py_b, но добавьте столбец с исходным именем файла к каждому элементу списка.

filenames <- list.files(path = getwd(), pattern = "xlsx")

Raw_Data <- lapply(filenames, function(x) {

  out_tibble <- read_xlsx(path = x,  col_names = c('time', 'intesity'))
  out_tibble$source_file <- basename(x) # add a column with the excel file name

  return(out_tibble)
})

Если вы хотите объединить список таблиц в один большой, вы можете использовать do.call('rbind', Raw_Data)

...