web-dev-qa-db-fra.com

Boucle en R pour lire plusieurs fichiers

Je me demandais si quelqu'un connaissait un moyen de créer une boucle qui charge des fichiers/bases de données dans R. . Disons que j'ai des fichiers comme celui-ci: data1.csv, data2.csv, ..., data100.csv.

Dans certains langages de programmation, vous pouvez faire quelque chose comme ceci data + {x} + .csv, le système le reconnaît comme datax.csv, et vous pouvez ensuite appliquer la boucle.

Des idées?

30
DonC

Sys.glob() est une autre possibilité - son seul but est d’agrandir ou d’agrandir le caractère générique.

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

Cela lira tous les fichiers de la forme data[x].csv dans la liste dataFiles, où [x] ne représente rien ou rien.

[Notez que ceci est un pattern différent de celui de la réponse de @ Joshua. Là, list.files() prend une expression régulière, alors que Sys.glob() utilise uniquement des caractères génériques standard; les caractères génériques pouvant être utilisés dépendent du système, des détails peuvent être utilisés disponibles à la page d'aide ?Sys.glob.]

49
Gavin Simpson

Voir ?list.files

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

Ensuite, vous pouvez boucler myFiles.

24
Joshua Ulrich

Je mettrais tous les fichiers CSV dans un répertoire, créerais une liste et ferais une boucle pour lire tous les fichiers CSV du répertoire dans la liste. 

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]]) 
7
PAC

Lire les en-têtes d'un fichier pour pouvoir les utiliser dans un fichier fusionné

library(dplyr)
library(readr)

list_file <- list.files(pattern = "*.csv") %>% 
  lapply(read.csv, stringsAsFactors=F) %>% 
   bind_rows 
3
fi<-list.files(directory_path,full.names=T)
dat<-lapply(fi,read.csv)

dat contiendra les jeux de données dans une liste

3
CDX

Supposons que vos fichiers ont le format de fichier que vous avez mentionné dans votre question et qu'ils se trouvent dans le répertoire de travail.

Vous pouvez vectoriser la création des noms de fichiers s'ils ont une structure de nommage simple. Puis appliquez une fonction de chargement sur tous les fichiers (ici, j'ai utilisé purrr package, mais vous pouvez aussi utiliser lapply)

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

Cela peut être utile si vous avez des ensembles de données pour les participants tels que psychologie/sport/médecine, etc.

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) ) )
0
SDahm