我一直想知道是否有人知道如何创建一个在R中加载文件/数据库的循环。 假设我有一些类似的文件:data1.csv,data2.csv,...,data100.csv。
在某些编程语言中,您可以执行类似此数据+ {x} + .csv的操作,系统会将其识别为datax.csv,然后您可以应用循环。
有什么想法吗?
答案 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))
}