Подтвердить что ты не робот

Как вы читаете в нескольких файлах .txt в R?

Я использую R для визуализации некоторых данных, все из которых находятся в формате .txt. В каталоге есть несколько сотен файлов, и я хочу загрузить их в одну таблицу за один снимок.

Любая помощь?

EDIT:

Список файлов не является проблемой. Но у меня возникают проблемы с переходом из списка в контент. Я пробовал некоторые из кода здесь, но я получаю ошибку с этой частью:

all.the.data <- lapply( all.the.files,  txt  , header=TRUE)

говоря,

 Error in match.fun(FUN) : object 'txt' not found

Приветствуются любые фрагменты кода, которые могли бы прояснить эту проблему.

4b9b3361

Ответ 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")

Это действительно так просто.