你如何将多个.txt文件读入R?

时间:2010-08-03 15:08:56

标签: r lapply fread read.table readr

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

任何帮助?

编辑:

列出文件不是问题。但是我无法从列表转到内容。我已经尝试了here中的一些代码,但我得到了这个部分的错误:

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

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

将会非常感谢任何可以澄清此问题的代码片段。

5 个答案:

答案 0 :(得分:29)

你可以试试这个:

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) 

答案 1 :(得分:10)

有两种快速方法可以读取多个文件并将它们放入单个数据框或data.table

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

list_of_files <- list.files(path = ".", recursive = TRUE,
                            pattern = "\\.txt$", 
                            full.names = TRUE)

1)使用fread()包中的rbindlist() w / 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()框架中的purrr::map_df() w / 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")

注意:要清理文件名,请使用basenamegsub函数

修改1 :阅读多个csv个文件,并使用readr::read_csv

跳过header
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()

答案 2 :(得分:5)

查看函数dir()又名list.files()的帮助。这允许您获得一个文件列表,可能通过正则表达式过滤,您可以循环使用。

如果您想要一次性使用它们,首先必须在一个文件中包含内容。一种选择是使用cat将所有文件键入stdout并使用popen()读取该文件。有关详情,请参阅help(Connections)

答案 3 :(得分: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)    

} 

答案 4 :(得分:3)

现在有一种非常简单的方法: readtext 包。

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

真的很容易。