在R中循环读取许多文件

Don*_*onC 34 loops r

我一直想知道是否有人知道如何创建一个在R中加载文件/数据库的循环.说我有一些这样的文件:data1.csv,data2.csv,...,data100.csv.

在某些编程语言中,您可以执行类似此数据+ {x} + .csv的操作,系统将其识别为datax.csv,然后您可以应用循环.

有任何想法吗?

Rei*_*son 51

Sys.glob() 是另一种可能性 - 它的唯一目的是通配符或通配符扩展.

dataFiles <- lapply(Sys.glob("data*.csv"), read.csv)
Run Code Online (Sandbox Code Playgroud)

这会将表单中的所有文件读data[x].csv入列表dataFiles,其中[x]什么也没有.

[注意这是一个不同的模式,以在@约书亚的答案.在那里,list.files()采用正则表达式,而Sys.glob()只使用标准通配符; 可以使用哪些通配符是系统相关的,可以在帮助页面上找到可以使用的详细信息?Sys.glob.

  • 是否可以以结果列表中的每个项目以通配符捕获位命名的方式来执行此操作?因此,给定“folder\*.csv”,每个列表项将被称为“data1”、“data2”等。我意识到下面的循环之一可以工作(也许使用“assign()”?)但是一个非循环解决方案感觉更优雅。 (2认同)

Jos*_*ich 26

?list.files.

myFiles <- list.files(pattern="data.*csv")
Run Code Online (Sandbox Code Playgroud)

然后你可以循环myFiles.

  • @DWin:我不确定那会如何更安全。我的“.*”会捕获文件扩展名之前的“.”。如果你真的想安全/明确,你可以使用 `"^data[[:digit:]]*\\.csv$"`。:-) (2认同)
  • 我的想法是"data.*csv"不需要"." 在那里. (2认同)

PAC*_*PAC 7

我会将所有CSV文件放在一个目录中,创建一个列表并执行循环以从列表中的目录中读取所有csv文件.

setwd("~/Documents/")
ldf <- list() # creates a list
listcsv <- dir(pattern = "*.csv") # creates the list of all the csv files in the directory
for (k in 1:length(listcsv)){
 ldf[[k]] <- read.csv(listcsv[k])
}
str(ldf[[1]]) 
Run Code Online (Sandbox Code Playgroud)


小智 6

阅读文件中的标题,以便我们可以使用它们替换合并文件中的标题

library(dplyr)
library(readr)

list_file <- list.files(pattern = "*.csv") %>% 
  lapply(read.csv, stringsAsFactors=F) %>% 
   bind_rows 
Run Code Online (Sandbox Code Playgroud)


小智 5

fi<-list.files(directory_path,full.names=T)
dat<-lapply(fi,read.csv)
Run Code Online (Sandbox Code Playgroud)

dat 将包含列表中的数据集

  • 这将列出 `directory_path` 中的 *all* 文件,这不是必需的。根据@Joshua 的回答,您需要一个“模式”。 (2认同)