34

我正在使用 R 来可视化一些数据,所有这些数据都是 .txt 格式的。一个目录中有几百个文件,我想一次性将它们全部加载到一个表中。

有什么帮助吗?

编辑:

列出文件不是问题。但是我在从列表到内容时遇到了麻烦。我已经尝试了这里的一些代码,但是这部分有一个错误:

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

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

任何能澄清这个问题的代码片段都将不胜感激。

4

5 回答 5

38

你可以试试这个:

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) 
于 2010-08-03T16:24:13.973 回答
33

读取多个文件并将它们放入单个数据框或数据表中的三种快速方法

首先获取所有txt文件的列表(包括子文件夹中的)

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")

3)(可能是三者中最快的)使用vroom::vroom()

#install.packages("vroom", 
#                 dependencies = TRUE, repos = "https://cran.rstudio.com")
library(vroom)

# Read all the files and create a FileName column to store filenames
df <- vroom(list_of_files, .id = "FileName")

   

注意:清理文件名,使用basenamegsub功能

基准测试: readr vsdata.tablevsvroom大数据

vroom-benchmark


编辑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()

于 2018-01-05T01:09:50.910 回答
11

现在有一个非常非常简单的方法可以做到这一点:readtext包。

readtext::readtext("path_to/your_files/*.txt")

它真的很容易。

于 2017-07-28T15:42:05.167 回答
5

查看函数dir()aka的帮助list.files()。这使您可以获取可能由正则表达式过滤的文件列表,您可以在其上循环。

如果您想一次全部使用它们,则首先必须将内容放在一个文件中。一种选择是使用cat将所有文件键入stdout并使用popen(). 查看help(Connections)更多。

于 2010-08-03T15:14:39.617 回答
4

感谢所有的答案!

同时,我也自己破解了一个方法。让我知道它是否有用:

library(foreign)

setwd("/path/to/directory")

files <-list.files()

data <- 0


for (f in files) {

tempData = scan( f, what="character")

data <- c(data,tempData)    

} 
于 2010-08-03T19:53:23.060 回答