Как вы читаете в несколько файлов.txt в R?
Я использую R для визуализации некоторых данных в формате.txt. В каталоге несколько сотен файлов, и я хочу загрузить все это в одну таблицу за один раз.
Любая помощь?
РЕДАКТИРОВАТЬ:
Перечисление файлов не является проблемой. Но у меня возникают проблемы при переходе от списка к контенту. Я попробовал часть кода здесь, но я получаю ошибку с этой частью:
all.the.data <- lapply( all.the.files, txt , header=TRUE)
поговорка
Error in match.fun(FUN) : object 'txt' not found
Будем весьма благодарны за любые фрагменты кода, которые прояснят эту проблему.
5 ответов
Спасибо за ответы на все вопросы!
Тем временем я также взломал метод самостоятельно. Дайте мне знать, если это будет полезно:
library(foreign)
setwd("/path/to/directory")
files <-list.files()
data <- 0
for (f in files) {
tempData = scan( f, what="character")
data <- c(data,tempData)
}
Вы можете попробовать это:
filelist = list.files(pattern = ".*.txt")
#assuming tab separated values with a header
datalist = lapply(filelist, function(x)read.table(x, header=T))
#assuming the same header/columns for all files
datafr = do.call("rbind", datalist)
Существует два быстрых способа чтения нескольких файлов и помещения их в один фрейм данных или таблицу данных.
С помощью fread()
ж / rbindlist()
от data.table
пакет
# List all txt files including sub-folders
list_of_files <- list.files(path = ".", recursive = TRUE,
pattern = "\\.txt$", full.names = TRUE)
library(data.table)
# Read all the files and create a FileName column to store filenames
DT <- rbindlist( sapply(list_of_files, fread, simplify = FALSE),
use.names = TRUE, idcol = "FileName" )
С помощью purrr::map_df()
а также readr::read_table2()
от tidyverse
пакет:
library(tidyverse)
# Read all the files and create a FileName column to store filenames
df <- list_of_files %>%
set_names(.) %>%
map_df(read_table2, .id = "FileName")
Примечание: чтобы очистить имена файлов, используйте basename
или же gsub
функции
Редактировать: читать несколько csv
файлы и пропустить header
df <- list_of_files %>%
purrr::set_names(nm = (basename(.) %>% tools::file_path_sans_ext())) %>%
purrr::map_df(read_csv,
col_names = FALSE,
skip = 1,
.id = "fileName")
Есть действительно очень простой способ сделать это сейчас: пакет readtext.
readtext::readtext("path_to/your_files/*.txt")
Это действительно так просто.
Посмотрите на помощь для функций dir()
ака list.files()
, Это позволяет получить список файлов, возможно, отфильтрованных по регулярным выражениям, по которым вы можете зацикливаться.
Если вы хотите использовать их все сразу, сначала вы должны иметь содержимое в одном файле. Один вариант будет использовать cat
ввести все файлы в stdout
и читать это с помощью popen()
, Увидеть help(Connections)
для большего.