Loop в R для чтения многих файлов
Мне было интересно, знает ли кто-нибудь способ создания цикла, который загружает файлы/базы данных в R.
Скажем, у меня есть такие файлы: data1.csv, data2.csv,..., data100.csv.
На некоторых языках программирования вы можете сделать что-то вроде этих данных + {x} +.csv, система распознает его как datax.csv, а затем вы можете применить цикл.
Любые идеи?
Ответы
Ответ 1
Sys.glob()
- это еще одна возможность - единственная цель - расширение или подстановочное расширение.
dataFiles <- lapply(Sys.glob("data*.csv"), read.csv)
Это будет читать все файлы формы data[x].csv
в список dataFiles
, где [x]
ничего и ничего.
[Обратите внимание, что это отличается от шаблона в @Joshua Answer. Там list.files()
принимает регулярное выражение, тогда как Sys.glob()
просто использует стандартные подстановочные знаки; какие подстановочные знаки могут использоваться, зависит от системы, детали могут быть найдены на странице справки ?Sys.glob
.]
Ответ 2
См. ?list.files
.
myFiles <- list.files(pattern="data.*csv")
Затем вы можете выполнить цикл myFiles
.
Ответ 3
Я бы поместил все 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]])
Ответ 4
fi<-list.files(directory_path,full.names=T)
dat<-lapply(fi,read.csv)
dat будет содержать наборы данных в списке
Ответ 5
Прочитайте заголовки в файле, чтобы мы могли использовать их для замены в объединенном файле
library(dplyr)
library(readr)
list_file <- list.files(pattern = "*.csv") %>%
lapply(read.csv, stringsAsFactors=F) %>%
bind_rows
Ответ 6
Предположим, что ваши файлы имеют формат файла, который вы указали в своем вопросе, и что они находятся в рабочем каталоге.
Вы можете векторизовать создание имен файлов, если они имеют простую структуру именования. Затем примените функцию загрузки для всех файлов (здесь я использовал purrr, но вы также можете использовать lapply
)
library(purrr)
c(1:100) %>% paste0("data", ., ".csv") %>% map(read.csv)
Ответ 7
Это может быть полезно, если у вас есть наборы данных для участников, как в психологии/спорте/медицине и т.д.
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) ) )