在R中循环读取许多文件

时间:2011-04-22 17:20:33

标签: r loops

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

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

有什么想法吗?

8 个答案:

答案 0 :(得分:49)

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

dataFiles <- lapply(Sys.glob("data*.csv"), read.csv)

这会将data[x].csv表单中的所有文件都读入列表dataFiles,其中[x]无关紧要。

[请注意,这与@ Joshua的答案中的模式不同。在那里,list.files()采用正则表达式,而Sys.glob()只使用标准通配符;可以使用哪些通配符取决于系统,可以在帮助页?Sys.glob上找到可以使用的详细信息。]

答案 1 :(得分:24)

请参阅?list.files

myFiles <- list.files(pattern="data.*csv")

然后你可以循环myFiles

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

答案 3 :(得分:4)

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

library(dplyr)
library(readr)

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

答案 4 :(得分:3)

fi<-list.files(directory_path,full.names=T)
dat<-lapply(fi,read.csv)

dat将包含列表中的数据集

答案 5 :(得分:2)

假设您的文件具有您在问题中提到的文件格式,并且它们位于工作目录中。

如果文件名具有简单的命名结构,则可以对其进行矢量化。然后对所有文件应用加载函数(此处我使用purrr包,但您也可以使用lapply

library(purrr)
c(1:100) %>% paste0("data", ., ".csv") %>% map(read.csv)

答案 6 :(得分:0)

如果您有参与者的数据集,如心理学/运动/医学等,这可能会有所帮助。

setwd("C:/yourpath")

temp <- list.files(pattern = "*.sav")

#Maybe you want to unselect /delete IDs
DEL <- grep('ID(04|08|11|13|19).sav', temp)
temp2 <- temp[-DEL]

#Make a list of that contains all data
read.all <- lapply(temp2, read_sav)
#View(read.all[1])

#Option 1: put one under the next
df <- do.call("rbind", read.all)

Option 2: make something within each dataset (single IDs) e.g. get the mean of certain parts of each participant

mw_extraktion <- function(data_raw){
  data_raw <- data.frame(data_raw)
  #you may now calculate e.g. the mean for a certain variable for each ID
  ID <- data_raw$ID[1]
  data_OneID <- c(ID, Var2, Var3) #put your new variables (e.g. Means) here
} #end of function   
data_combined <- t(data.frame(sapply(read.all, mw_extraktion) ) )

答案 7 :(得分:0)

这是使用for循环的另一种解决方案。我比较喜欢它,因为它具有灵活性,并且所有df都直接存储在全局环境中。

假设您已经设置了工作目录,该算法将迭代读取所有文件,并将它们存储在全局环境中,名称为“ data i ”。

list<-c(1:100)
for (i in list) {
  filename<-paste0("data",i)
  wd<-paste0("data",i,".csv")
  assign(filename,read.csv(wd))
}