Что-то вроде следующего должно привести к тому, что каждый фрейм данных будет отдельным элементом в одном списке:
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
Это предполагает, что у вас есть эти CSV в одном каталоге - ваш текущий рабочий каталог - и что все они имеют расширение нижнего регистра .csv
.
Если после этого вы хотите , чтобы объединить эти кадры данных в один кадр данных, увидеть решения в других ответах , используя такие вещи , как do.call(rbind,...)
, dplyr::bind_rows()
или data.table::rbindlist()
.
Если вы действительно хотите, чтобы каждый фрейм данных был отдельным объектом, хотя это часто нежелательно, вы можете сделать следующее с помощью assign
:
temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))
Или без assign
и чтобы продемонстрировать (1) как можно очистить имя файла и (2) показать, как его использовать list2env
, вы можете попробовать следующее:
temp = list.files(pattern="*.csv")
list2env(
lapply(setNames(temp, make.names(gsub("*.csv$", "", temp))),
read.csv), envir = .GlobalEnv)
Но опять же, часто лучше оставлять их в одном списке.
assign
... Если вы хотите, чтобы назначенные значения находились в глобальной среде, убедитесь, что вы установилиinherits=T
.Быстрое и емкое
tidyverse
решение: (более чем в два раза быстрее, чем Base Rread.csv
)и data.table «s
fread()
может даже сократить те времена нагрузки наполовину снова. (для 1/4 базового R раз)stringsAsFactors = FALSE
Аргумент сохраняет фактор dataframe бесплатно (и , как Marbel указывает, является настройкой по умолчаниюfread
)Если приведение типов является нахальным, вы можете заставить все столбцы быть символами с
col_types
аргументом.Если вы хотите заглянуть в подкаталоги, чтобы составить список файлов для последующей привязки, обязательно укажите путь к файлу, а также зарегистрируйте файлы с их полными именами в списке. Это позволит выполнять связывание за пределами текущего каталога. (Думая о полных путевых именах, действующих как паспорта, чтобы разрешить перемещение обратно через «границы» каталога.)
Как Хэдли описывает здесь (примерно на полпути):
Бонусная функция - добавление имен файлов к записям по запросу функции Никса в комментариях ниже:
* Добавьте оригинал
filename
к каждой записи.Объясненный код: создайте функцию для добавления имени файла к каждой записи во время первоначального чтения таблиц. Затем используйте эту функцию вместо простой
read_csv()
функции.(Подходы обработки типов и подкаталогов могут также обрабатываться внутри
read_plus()
функции таким же образом, как показано во втором и третьем вариантах, предложенных выше.)Середина использования
Большой вариант использования
Разнообразие вариантов использования
Строки: количество файлов (1000, 100, 10)
Столбцы: конечный размер кадра данных (5 МБ, 50 МБ, 500 МБ)
(нажмите на изображение, чтобы посмотреть оригинальный размер)
Базовые результаты R лучше для самых маленьких случаев использования, когда издержки, связанные с переносом библиотек C purrr и dplyr, перевешивают выигрыш в производительности, который наблюдается при выполнении более масштабных задач обработки.
если вы хотите запускать свои собственные тесты, вам может пригодиться этот скрипт bash.
bash what_you_name_this_script.sh "fileName_you_want_copied" 100
создаст 100 копий вашего файла с последовательной нумерацией (после начальных 8 символов имени файла и подчеркивания).Атрибуты и благодарности
С особой благодарностью:
map_df()
здесь .fread()
. (Мне нужно учитьсяdata.table
.)источник
readAddFilename <- function(flnm) { read_csv(flnm) %>% mutate(filename = flnm) }
Тогда просто добавьте этоmap_df
вместо простого только для чтенияread_csv()
, которое есть сейчас. Я могу обновить запись выше, чтобы показать функцию и то, как она будет вписываться в канал, если у вас все еще есть вопросы или вы думаете, что это будет полезно.read_csv
гораздо медленнее, чемfread
. Я бы включил тест, если вы хотите сказать, что что-то быстрее. Одной из идей является создание 30 файлов по 1 ГБ и их чтение, в этом случае производительность имеет значение.fread()
и dplyr » sread_csv()
: 14,2 против 19,9 сек. TBH, я сравнивал только базу R с dplyr, и, какread_csv()
примерно в 2-4 раза быстрееread.csv()
, тестирование не показалось необходимым. Тем не менее, было интересноfread()
немного остановиться и проверить более полные результаты тестов. Еще раз спасибо!Вот несколько вариантов преобразования файлов .csv в один файл data.frame с использованием базы R и некоторых доступных пакетов для чтения файлов в R.
Это медленнее, чем варианты ниже.
Изменить: - Еще несколько дополнительных вариантов, используя
data.table
иreadr
fread()
Версия, которая является функциейdata.table
упаковки. Это, безусловно , самый быстрый вариант в R .Использование readr , который является еще одним пакетом для чтения CSV-файлов. Он медленнее
fread
, чем база R, но имеет другие функции.источник
data.table
версию, которая должна улучшить производительность.do.call
Помимо использования
lapply
или какой-либо другой циклической конструкции в R, вы можете объединить ваши CSV-файлы в один файл.В Unix, если файлы не имеют заголовков, это так же просто, как:
или если есть заголовки, и вы можете найти строку, которая соответствует заголовкам и только заголовкам (т.е. предположим, что все строки заголовка начинаются с «Age»), вы должны сделать:
Я думаю, что в Windows вы могли бы сделать это с помощью
COPY
иSEARCH
(илиFIND
что-то) из окна командной строки DOS, но почему бы не установитьcygwin
и не получить возможности командной оболочки Unix?источник
Git
установкой?Это код, который я разработал для чтения всех CSV-файлов в R. Он создаст информационный кадр для каждого CSV-файла в отдельности и назовет заголовок, который включает в себя исходное имя файла (без пробелов и .csv). Надеюсь, вы найдете его полезным!
источник
Три верхних ответа @ A5C1D2H2I1M1N2O1R2T1, @leerssej и @marbel, по сути, одинаковы: примените fread к каждому файлу, а затем выполните rbind / rbindlist для результирующих data.tables. Я обычно использую
rbindlist(lapply(list.files("*.csv"),fread))
форму.Это лучше, чем другие R-внутренние альтернативы, и хорошо для небольшого числа больших CSV, но не лучше для большого количества маленьких CSV, когда скорость имеет значение. В этом случае это может быть намного быстрее для первого использования
cat
, как предлагает @Spacedman в ответе 4-го ранга. Я добавлю некоторые подробности о том, как сделать это изнутри R:Однако что делать, если у каждого CSV есть заголовок?
А что если у вас так много файлов, что
*.csv
оболочка не работает?А что, если у всех файлов есть заголовок И слишком много файлов?
А что, если результирующий составной csv слишком велик для системной памяти?
С заголовками?
Наконец, что если вы не хотите все .csv в каталоге, а конкретный набор файлов? (Кроме того, все они имеют заголовки.) (Это мой вариант использования.)
и это примерно с той же скоростью, что и обычный кот xargs :)
Примечание: для data.table pre-v1.11.6 (19 сентября 2018) опустите
cmd=
fromfread(cmd=
.Приложение: использование mclapply параллельной библиотеки вместо последовательного lapply, например,
rbindlist(lapply(list.files("*.csv"),fread))
также намного быстрее, чем rbindlist lapply fread.Время читать 121401 csvs в одну таблицу data.table. Каждый CSV имеет 3 столбца, одну строку заголовка и в среднем 4,510 строк. Машина представляет собой виртуальную машину GCP с 96 ядрами:
Подводя итог, если вы заинтересованы в скорости и имеете много файлов и много ядер, fread xargs cat примерно в 50 раз быстрее, чем самое быстрое решение в топ-3 ответов.
источник
На мой взгляд, большинство других ответов устарели
rio::import_list
, что является кратким однострочником:Любые дополнительные аргументы передаются
rio::import
.rio
может иметь дело практически с любым форматом файла, который может прочитать R, и он используетdata.table
,fread
где это возможно, поэтому он также должен быть быстрым.источник
Использование
plyr::ldply
позволяет увеличить скорость примерно на 50%, включив.parallel
опцию при чтении 400 CSV-файлов по 30-40 МБ каждый. Пример включает текстовый индикатор выполнения.источник
fread
илиuser-defined functions
? Спасибо!?ldply
показывает...
другие аргументы переданы.fun
. Используя либо,fread, skip = 100
либоfunction(x) fread(x, skip = 100)
будет работатьfunction(x) fread(x, skip = 100)
не работает для меня, но предоставление дополнительных аргументов после голого имени функции добилось цели. Еще раз спасибо!Опираясь на комментарий dnlbrk, для больших файлов метод assign может быть значительно быстрее, чем list2env.
Если для аргумента full.names задано значение true, вы получите полный путь к каждому файлу в виде отдельной символьной строки в вашем списке файлов, например, List_of_file_paths [1] будет выглядеть примерно так: «C: / Users / Anon / Documents / Folder_with_csv_files / file1.csv»
Вы можете использовать файл read.csv пакета fread или base R read.csv вместо read_csv. Шаг file_name позволяет привести в порядок имя, чтобы каждый фрейм данных не оставался с полным путем к файлу в качестве его имени. Вы можете расширить свой цикл, чтобы выполнить дальнейшие действия с таблицей данных, прежде чем перенести ее в глобальную среду, например:
источник
Это мой конкретный пример, чтобы прочитать несколько файлов и объединить их в 1 кадр данных:
источник
rbindlist()
сdata.table
Следующие коды должны обеспечить максимальную скорость для больших данных, если на вашем компьютере много ядер:
Обновлено в 2020/04/16: Поскольку я нахожу новый пакет, доступный для параллельных вычислений, предлагается альтернативное решение с использованием следующих кодов.
источник
Мне нравится подход, использующий
list.files()
,lapply()
иlist2env()
(илиfs::dir_ls()
,purrr::map()
иlist2env()
). Это кажется простым и гибким.Кроме того, вы можете попробовать небольшой пакет { tor } ( to-R ): по умолчанию он импортирует файлы из рабочего каталога в список (
list_*()
варианты) или в глобальную среду (load_*()
варианты).Например, здесь я читаю все файлы .csv из моего рабочего каталога в список, используя
tor::list_csv()
:И теперь я загружаю эти файлы в мою глобальную среду с
tor::load_csv()
:Если вам нужно прочитать определенные файлы, вы можете сопоставить их путь к файлу с
regexp
,ignore.case
иinvert
.Для еще большей гибкости использования
list_any()
. Это позволяет вам предоставлять функцию чтения через аргумент.f
.Передайте дополнительные аргументы через ... или внутри лямбда-функции.
источник
Мне было предложено добавить эту функциональность в пакет stackoverflow R. Учитывая, что это крошечный пакет (и он не может зависеть от сторонних пакетов), вот что я придумал:
Параметрируя функции чтения и редуктора, люди могут использовать data.table или dplyr, если они того пожелают, или просто использовать базовые функции R, которые подходят для небольших наборов данных.
источник