我正在使用R来显示一些所有数据都是.txt格式的数据。目录中有几百个文件,我想一次性将它们全部加载到一个表中。
任何帮助?
编辑:
列出文件不是问题。但是我无法从列表转到内容。我已经尝试了here中的一些代码,但我得到了这个部分的错误:
all.the.data <- lapply( all.the.files, txt , header=TRUE)
说
Error in match.fun(FUN) : object 'txt' not found
将会非常感谢任何可以澄清此问题的代码片段。
答案 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")
注意:要清理文件名,请使用basename
或gsub
函数
修改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")
真的很容易。