Как вы читаете в нескольких файлах .txt в R?
Я использую R для визуализации некоторых данных, все из которых находятся в формате .txt. В каталоге есть несколько сотен файлов, и я хочу загрузить их в одну таблицу за один снимок.
Любая помощь?
EDIT:
Список файлов не является проблемой. Но у меня возникают проблемы с переходом из списка в контент. Я пробовал некоторые из кода здесь, но я получаю ошибку с этой частью:
all.the.data <- lapply( all.the.files, txt , header=TRUE)
говоря,
Error in match.fun(FUN) : object 'txt' not found
Приветствуются любые фрагменты кода, которые могли бы прояснить эту проблему.
Ответы
Ответ 1
Спасибо за все ответы!
Между тем, я также сам взломал метод. Дайте мне знать, если это полезно:
library(foreign)
setwd("/path/to/directory")
files <-list.files()
data <- 0
for (f in files) {
tempData = scan( f, what="character")
data <- c(data,tempData)
}
Ответ 2
Вы можете попробовать следующее:
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)
Ответ 3
Существует два быстрых способа чтения нескольких файлов и помещения их в один фрейм данных или таблицу данных.
Сначала получите список всех текстовых файлов (в том числе в подпапках)
list_of_files <- list.files(path = ".", recursive = TRUE,
pattern = "\\.txt$",
full.names = TRUE)
1) Используйте fread()
w/ rbindlist()
из пакета data.table
#install.packages("data.table", repos = "https://cran.rstudio.com")
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")
2) Используйте readr::read_table2()
w/ purrr::map_df()
из структуры tidyverse
:
#install.packages("tidyverse",
# dependencies = TRUE, repos = "https://cran.rstudio.com")
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
Изменить 1: чтобы прочитать несколько файлов csv
и пропустить header
используя readr::read_csv
list_of_files <- list.files(path = ".", recursive = TRUE,
pattern = "\\.csv$",
full.names = TRUE)
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")
Редактировать 2: чтобы преобразовать шаблон, включающий подстановочный знак, в эквивалентное регулярное выражение, используйте glob2rx()
Ответ 4
Посмотрите справочную информацию о функциях dir()
aka list.files()
. Это позволяет получить список файлов, возможно, отфильтрованных регулярными выражениями, по которым вы могли бы зацикливаться.
Если вы хотите, чтобы все сразу, вам сначала нужно иметь контент в одном файле. Один из вариантов заключается в использовании cat
для ввода всех файлов в stdout
и чтения с использованием popen()
. Подробнее см. help(Connections)
.
Ответ 5
Существует действительно простой способ сделать это сейчас: пакет readtext.
readtext::readtext("path_to/your_files/*.txt")
Это действительно так просто.